使用dplyr的filter和mutate生成一个新变量

时间:2015-01-05 12:56:45

标签: r dplyr

我选择hflights-dataset作为例子。

我尝试从平面创建一个包含“TailNum”的变量/列,但仅适用于播放时间最长的10%以下的平面。

install.packages("hflights") 
library("hflights") 
flights <-tbl_df(hflights) 
flights %>% filter(cume_dist(desc(AirTime)) < 0.1) %>% mutate(new_var=TailNum)

编辑:结果数据帧只有22208个obs而不是227496.有没有办法保留原始数据帧,但为TeilNum添加一个新的变量,用于具有百分之十的通话时间的飞机?

1 个答案:

答案 0 :(得分:3)

管道后面flights中不需要mutate()

flights %>% filter(cume_dist(desc(AirTime)) < 0.1) %>% mutate(new = TailNum)

此外,new是一个函数,因此最好将其作为变量名称。见?新。 举例说明:

flights <-tbl_df(hflights) 
flights %>% filter(cume_dist(desc(AirTime)) < 0.1) %>% 
+   mutate(new_var = TailNum, new = TailNum) %>%
+   select(AirTime, TailNum, new_var)
Source: local data frame [22,208 x 3]

   AirTime TailNum new_var
1      255  N614AS  N614AS
2      257  N627AS  N627AS
3      260  N627AS  N627AS
4      268  N618AS  N618AS
5      273  N607AS  N607AS
6      278  N624AS  N624AS
7      274  N611AS  N611AS
8      269  N607AS  N607AS
9      253  N609AS  N609AS
10     315  N626AS  N626AS
..     ...     ...     ...

要保留所有观察结果,请丢失filter()。我的常规方法是使用ifelse()代替。其他人可能会建议更好的解决方案。

f2 <- flights %>% mutate(cumdist = cume_dist(desc(AirTime)), 
                   new_var = ifelse(cumdist < 0.1, TailNum, NA)) %>%
  select(AirTime, TailNum, cumdist, new_var)

table(is.na(f2$new_var))

 FALSE   TRUE 
 22208 205288