首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中等价的Case语句

在R中等价的Case语句
EN

Stack Overflow用户
提问于 2011-01-07 10:39:27
回答 15查看 181.3K关注 0票数 98

我在一个数据帧中有一个变量,其中一个字段通常有7-8个值。我想在数据帧内的一个新变量中将它们整理成3到4个新类别。最好的方法是什么?

如果我在一个类似SQL的工具中,但不确定如何在R中攻击它,我会使用CASE语句。

如果您能提供任何帮助,我们将不胜感激!

EN

回答 15

Stack Overflow用户

发布于 2017-01-26 11:51:18

case_when()在2016年5月被添加到dplyr中,以类似于memisc::cases()的方式解决了这个问题。

例如:

代码语言:javascript
复制
library(dplyr)
mtcars %>% 
  mutate(category = case_when(
    .$cyl == 4 & .$disp < median(.$disp) ~ "4 cylinders, small displacement",
    .$cyl == 8 & .$disp > median(.$disp) ~ "8 cylinders, large displacement",
    TRUE ~ "other"
  )
)

从dplyr 0.7.0开始,

代码语言:javascript
复制
mtcars %>% 
  mutate(category = case_when(
    cyl == 4 & disp < median(disp) ~ "4 cylinders, small displacement",
    cyl == 8 & disp > median(disp) ~ "8 cylinders, large displacement",
    TRUE ~ "other"
  )
)
票数 45
EN

Stack Overflow用户

发布于 2011-01-08 02:15:34

看看memisc包中的cases函数。它通过两种不同的方式实现case功能。来自包中的示例:

代码语言:javascript
复制
z1=cases(
    "Condition 1"=x<0,
    "Condition 2"=y<0,# only applies if x >= 0
    "Condition 3"=TRUE
    )

其中xy是两个向量。

参考文献:memisc packagecases example

票数 29
EN

Stack Overflow用户

发布于 2011-01-07 21:49:53

下面是使用switch语句的一种方法:

代码语言:javascript
复制
df <- data.frame(name = c('cow','pig','eagle','pigeon'), 
                 stringsAsFactors = FALSE)
df$type <- sapply(df$name, switch, 
                  cow = 'animal', 
                  pig = 'animal', 
                  eagle = 'bird', 
                  pigeon = 'bird')

> df
    name   type
1    cow animal
2    pig animal
3  eagle   bird
4 pigeon   bird

这样做的一个缺点是,您必须一直为每个项目编写类别名称(animal等)。能够像下面这样定义我们的类别在语法上更方便(参见非常类似的问题How do add a column in a data frame in R )

代码语言:javascript
复制
myMap <- list(animal = c('cow', 'pig'), bird = c('eagle', 'pigeon'))

我们想以某种方式“反转”这个映射。我编写了自己的invMap函数:

代码语言:javascript
复制
invMap <- function(map) {
  items <- as.character( unlist(map) )
  nams <- unlist(Map(rep, names(map), sapply(map, length)))
  names(nams) <- items
  nams
}

然后反转上面的映射,如下所示:

代码语言:javascript
复制
> invMap(myMap)
     cow      pig    eagle   pigeon 
"animal" "animal"   "bird"   "bird" 

然后很容易使用它在数据框中添加type列:

代码语言:javascript
复制
df <- transform(df, type = invMap(myMap)[name])

> df
    name   type
1    cow animal
2    pig animal
3  eagle   bird
4 pigeon   bird
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4622060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档