我在一个数据帧中有一个变量,其中一个字段通常有7-8个值。我想在数据帧内的一个新变量中将它们整理成3到4个新类别。最好的方法是什么?
如果我在一个类似SQL的工具中,但不确定如何在R中攻击它,我会使用CASE语句。
如果您能提供任何帮助,我们将不胜感激!
发布于 2017-01-26 11:51:18
case_when()在2016年5月被添加到dplyr中,以类似于memisc::cases()的方式解决了这个问题。
例如:
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开始,
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"
)
)发布于 2011-01-08 02:15:34
看看memisc包中的cases函数。它通过两种不同的方式实现case功能。来自包中的示例:
z1=cases(
"Condition 1"=x<0,
"Condition 2"=y<0,# only applies if x >= 0
"Condition 3"=TRUE
)其中x和y是两个向量。
发布于 2011-01-07 21:49:53
下面是使用switch语句的一种方法:
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 )
myMap <- list(animal = c('cow', 'pig'), bird = c('eagle', 'pigeon'))我们想以某种方式“反转”这个映射。我编写了自己的invMap函数:
invMap <- function(map) {
items <- as.character( unlist(map) )
nams <- unlist(Map(rep, names(map), sapply(map, length)))
names(nams) <- items
nams
}然后反转上面的映射,如下所示:
> invMap(myMap)
cow pig eagle pigeon
"animal" "animal" "bird" "bird" 然后很容易使用它在数据框中添加type列:
df <- transform(df, type = invMap(myMap)[name])
> df
name type
1 cow animal
2 pig animal
3 eagle bird
4 pigeon birdhttps://stackoverflow.com/questions/4622060
复制相似问题