dplyr管道 - 如何更改原始数据帧

Sil*_*bow 9 r dplyr data-cleaning

当我不使用管道时,我可以使用此命令更改原始daframe

df<-slice(df,-c(1:3))%>% # delete top 3 rows
df<-select(df,-c(Col1,Col50,Col51)) # delete specific columns
Run Code Online (Sandbox Code Playgroud)

如何使用管道做到这一点?我试过这个但是sliceselect函数不会改变原始数据帧.

df%>%
  slice(-c(1:3))%>% 
  select(-c(Col1,Col50,Col51))
Run Code Online (Sandbox Code Playgroud)

我想改变原来的df.

Ric*_*ven 14

你绝对可以使用诸如df <- df %>% ...或之类的成语来完成作业df %>% ... -> df.但是你也可以df通过在管道的开头使用magrittr复合赋值运算符来避免冗余(即,说两次)%<>%.

从小magrittr插图:

复合赋值管道运算符%<>%可用作链中的第一个管道.结果是管道的结果被分配给左侧对象,而不是像往常一样返回结果.

因此,使用您的代码,我们可以做到

library(magrittr)  ## came with your dplyr install
df %<>% slice(-(1:3)) %>% select(-c(Col1, Col50, Col51))
Run Code Online (Sandbox Code Playgroud)

这将df导入表达式并df作为结果进行更新.

更新: 在注释中您注意到设置列名称的问题.幸运的是,magrittr它提供了在管道中设置属性的功能.请尝试以下方法.

df %<>% 
    set_colnames(sprintf("Col%d", 1:ncol(.))) %>% 
    slice(-(1:3)) %>%
    select(-c(Col1,Col50,Col51))
Run Code Online (Sandbox Code Playgroud)

请注意,由于我们有数据框,我们也可以使用setNames()(stats)或set_names()(magrittr)代替set_colnames().


感谢Steven Beaupre添加了小插图中的注释.