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

Use dplyr´s filter and mutate to generate a new variable

我选择hflights数据集作为例子。

我尝试创建一个 variable/column,其中包含来自飞机的 "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。有没有办法保留原始数据帧,但为通话时间占前 10% 的飞机添加一个带有 TeilNum 的新变量?

您不需要在 mutate() 中的 flights 中的管道。

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