使用 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
我选择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