当我不使用管道时,我可以使用此命令更改原始daframe
df<-slice(df,-c(1:3))%>% # delete top 3 rows
df<-select(df,-c(Col1,Col50,Col51)) # delete specific columns
如何使用管道做到这一点?我试过这个,但slice
和select
函数不会更改原始数据框。
df%>%
slice(-c(1:3))%>%
select(-c(Col1,Col50,Col51))
我想改变原来的df。
答案 0 :(得分:13)
您绝对可以使用df <- df %>% ...
或df %>% ... -> df
等惯用语来完成作业。但您也可以通过在管道开头使用df
复合赋值运算符magrittr
来避免冗余(即,说明%<>%
两次)。
来自magrittr
小插曲:
复合赋值管道运算符
%<>%
可用作链中的第一个管道。结果是管道的结果被分配给左侧对象,而不是像往常一样返回结果。
因此,使用您的代码,我们可以
library(magrittr) ## came with your dplyr install
df %<>% slice(-(1:3)) %>% select(-c(Col1, Col50, Col51))
将df
传递到表达式中,并将df
更新为结果。
更新:在评论中,您注意到设置列名称时出现问题。幸运的是,magrittr
提供了在管道中设置属性的功能。请尝试以下方法。
df %<>%
set_colnames(sprintf("Col%d", 1:ncol(.))) %>%
slice(-(1:3)) %>%
select(-c(Col1,Col50,Col51))
请注意,由于我们有数据框,因此我们也可以使用setNames()
(统计信息)或set_names()
(magrittr)代替set_colnames()
。
感谢Steven Beaupre添加了插图中的注释。