R中的Case语句等效语句

106

我在一个数据框中有一个变量,其中一个字段通常有7-8个值。我想将它们合并为3或4个新类别,并将其放入数据框中的一个新变量中。什么是最好的方法?

如果我在像SQL这样的工具中,我会使用CASE语句,但不确定如何在R中解决这个问题。

非常感谢您能提供的任何帮助!

17个回答

4
自从 data.table v1.13.0 版本以来,您可以使用函数 fcase()(快速情况)进行类似 SQL 的 CASE 操作(也类似于 dplyr::case_when())。
require(data.table)

dt <- data.table(name = c('cow','pig','eagle','pigeon','cow','eagle'))
dt[ , category := fcase(name %in% c('cow', 'pig'), 'mammal',
                        name %in% c('eagle', 'pigeon'), 'bird') ]

3

如果您想使用类似SQL的语法,只需使用sqldf包即可。要使用的函数也被命名为sqldf,其语法如下:

sqldf(<your query in quotation marks>)

2
com = '102'
switch (com,
    '110' = (com= '23279'),
    '101' = (com='23276'),
    '102'= (com = '23277'),
    '111' = (com = '23281'),
    '112' = (com = '23283')
)

print(com)

2
这个答案与2016年的另一个答案非常相似。您能否包含更多信息或详细说明此答案与其他答案有何不同? - aaossa
它是一个数字情况下的开关代理,与switch语句不同;更准确地说,它的工作方式不同。 - Hugues

2
您可以使用base函数merge来进行大小写映射任务:
df <- data.frame(name = c('cow','pig','eagle','pigeon','cow','eagle'), 
                 stringsAsFactors = FALSE)

mapping <- data.frame(
  name=c('cow','pig','eagle','pigeon'),
  category=c('mammal','mammal','bird','bird')
)

merge(df,mapping)
# name category
# 1    cow   mammal
# 2    cow   mammal
# 3  eagle     bird
# 4  eagle     bird
# 5    pig   mammal
# 6 pigeon     bird

2

在这里,使用case语句实际上可能不是正确的方法。如果这是一个因子,很可能是,只需适当设置因子的级别。

假设您有一个包含字母A到E的因子,就像这样。

> a <- factor(rep(LETTERS[1:5],2))
> a
 [1] A B C D E A B C D E
Levels: A B C D E

如果要将B和C级别合并并命名为BC,只需将这些级别的名称更改为BC即可。

> levels(a) <- c("A","BC","BC","D","E")
> a
 [1] A  BC BC D  E  A  BC BC D  E 
Levels: A BC D E

结果符合预期。

2

我觉得混合使用 plyr::mutatedplyr::case_when 很适合我,而且很易读。

iris %>%
plyr::mutate(coolness =
     dplyr::case_when(Species  == "setosa"     ~ "not cool",
                      Species  == "versicolor" ~ "not cool",
                      Species  == "virginica"  ~ "super awesome",
                      TRUE                     ~ "undetermined"
       )) -> testIris
head(testIris)
levels(testIris$coolness)  ## NULL
testIris$coolness <- as.factor(testIris$coolness)
levels(testIris$coolness)  ## ok now
testIris[97:103,4:6]

如果列能够作为因子而不是字符从mutate中出来,那就更好了!case_when语句的最后一行非常重要,它捕获所有未匹配的行。
     Petal.Width    Species      coolness
 97         1.3  versicolor      not cool
 98         1.3  versicolor      not cool  
 99         1.1  versicolor      not cool
100         1.3  versicolor      not cool
101         2.5  virginica     super awesome
102         1.9  virginica     super awesome
103         2.1  virginica     super awesome

0
通常使用一个(小)参考表来映射分类会更容易,这样非R语言的人也能更好地理解。你甚至可以设置一个表格来映射连接的变量。当然,你也可以设置多列。

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接