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

Posted

技术标签:

【中文标题】dplyr 管道 - 如何更改原始数据框【英文标题】:dplyr pipes - How to change the original dataframe 【发布时间】:2016-01-24 22:55:51 【问题描述】:

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

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

如何用管道做到这一点?我试过这个,但 sliceselect 函数不会改变原始数据框。

df%>%
  slice(-c(1:3))%>% 
  select(-c(Col1,Col50,Col51))

我想更改原来的df。

【问题讨论】:

然后做df &lt;- df%&gt;% slice(-c(1:3))%&gt;% select(-c(Col1,Col50,Col51)) 如果你愿意,也可以把作业放在最后:df %&gt;% ... -&gt; df library(magrittr); df %&lt;&gt;% slice(-(1:3)) %&gt;% select(-c(Col1,Col50,Col51))。我们可以使用%&lt;&gt;% 重新分配原始数据框。这里df 将被更改。 【参考方案1】:

您绝对可以使用诸如df &lt;- df %&gt;% ...df %&gt;% ... -&gt; df 之类的习语来完成作业。但是您也可以通过在管道开头使用magrittr 复合赋值运算符%&lt;&gt;% 来避免冗余(即声明df 两次)。

来自magrittr 小插图:

复合赋值管道运算符%&lt;&gt;% 可用作链中的第一个管道。效果将是管道的结果被分配给左侧对象,而不是像往常一样返回结果。

所以用你的代码,我们可以做到

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

这会将df 导入表达式并更新df 作为结果。

更新:在 cmets 中,您注意到设置列名的问题。幸运的是magrittr 提供了在管道中设置属性的功能。请尝试以下操作。

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

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


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

【讨论】:

两者之间可以有一个通用的 r 语句吗?当我在管道语句之间添加 colnames 函数调用时,我收到错误 df%&lt;&gt;% colnames(df)&lt;-vector_columnnames%&gt;% slice(-c(1:3))%&gt;% select(-c(Col1,Col50,Col51)) 对于后续问题,我深表歉意,但由于此线程可能对其他人有用,因此我将其放在这里。如果我想进行不属于 dplyr/magittr 包中函数的向量分配,例如 df%&lt;&gt;% vector_columnnames&lt;-sprintf("Col%d",1:length(df))%&gt;% set_colnames(vector_columnnames) %&gt;% slice(-c(1:3))%&gt;% # delete top 3 rows select(-c(Col1,Col50,Col51)) 怎么办。不执行vector_columnnames 语句。关于如何在管道中设置临时向量的任何建议? 如果df 是一个数据框,setNames() 不会像set_colnames() 一样工作吗? 是的。 setNames 也有效。 set_colnames 是一个 magrittr 'extract'。 值得注意的是,不可变性是一种非常有价值的编程策略。基本上,永远不要覆盖一个对象。这样,您可以以任何顺序重新运行和调试代码的任何部分。所以也许将第一个命名为 df.original 和第二个 df.final,完全避免使用 %%。

以上是关于dplyr 管道 - 如何更改原始数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用 dplyr 管道更改列值

R语言基础知识|dplyr管道函数处理表格

作为 dplyr 管道的一部分,将中间输出分配给 temp 变量

对于高基数分组,为啥使用 dplyr 管道 (%>%) 比等效的非管道表达式慢?

使用管道运算符时将 dplyr 重命名应用于所有列

R----dplyr包介绍学习