我在一个数据框中有一个变量,其中一个字段通常有7-8个值。我想将它们合并为3或4个新类别,并将其放入数据框中的一个新变量中。什么是最好的方法?
如果我在像SQL这样的工具中,我会使用CASE语句,但不确定如何在R中解决这个问题。
非常感谢您能提供的任何帮助!
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') ]
如果您想使用类似SQL的语法,只需使用sqldf
包即可。要使用的函数也被命名为sqldf
,其语法如下:
sqldf(<your query in quotation marks>)
com = '102'
switch (com,
'110' = (com= '23279'),
'101' = (com='23276'),
'102'= (com = '23277'),
'111' = (com = '23281'),
'112' = (com = '23283')
)
print(com)
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
在这里,使用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
我觉得混合使用 plyr::mutate
和 dplyr::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]
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