使用Dplyr编码组内的多个级别

时间:2016-06-07 19:44:19

标签: r dplyr subset

如果数据按几个因素分组后,如果有多个级别,我正在尝试为我的数据集编码一列。为简单起见,我使用mtcars数据集作为示例。我不断收到错误“错误:过滤条件不会计算为逻辑向量。”

显然这种语法是不可接受的,但有没有人有更聪明的方法呢?

 df_levels <-  mtcars %>%
   group_by(mpg) %>%
   filter(nlevels(.$gear) > 1) %>%
   mutate(Levels = 1) ##encode with a boolean value indicating more than one level 

 df_levels <-  df_levels %>%
   group_by(mpg) %>%
   filter(nlevels(.$gear) < 1) %>%
   mutate(Levels = 0)

因此,如果你点击新的df“df_levels”,并在df查看器中按mpg排序,你会看到一个列“level”= 0表示10.4 mpg的条目(因为只有gear = 3的数据) ,与30.4 mpg相关的“水平”列将具有值= 1,因为该数据分组中的齿轮有多个水平(齿轮= 4,齿轮= 5)。

2 个答案:

答案 0 :(得分:1)

gear中的变量mtcars不是因素,所以我认为你的意思是

mtcars$gear<-as.factor(mtcars$gear)

然后,试试这个:

library(dplyr)
mtcars %>%
  group_by(cyl) %>%
  filter(nlevels(.$gear) > 1) %>%
  mutate(Levels = 1)

我不确定你的问题是否是你所追求的,但至少它不会返回错误。

要明确的是,dplyr语法是非常干净的

mtcars %>%
group_by(cyl) %>%
filter(nlevels(gear) > 1) %>%
mutate(Levels = 1)

答案 1 :(得分:1)

mtcars %>%
  group_by(cyl) %>%
  mutate(Levels = ifelse(nlevels(as.factor(gear)) > 1, 1, 0))