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
如何用管道做到这一点?我试过这个,但 slice
和 select
函数不会改变原始数据框。
df%>%
slice(-c(1:3))%>%
select(-c(Col1,Col50,Col51))
我想更改原来的df。
【问题讨论】:
然后做df <- df%>% slice(-c(1:3))%>% select(-c(Col1,Col50,Col51))
如果你愿意,也可以把作业放在最后:df %>% ... -> df
或library(magrittr); df %<>% slice(-(1:3)) %>% select(-c(Col1,Col50,Col51))
。我们可以使用%<>%
重新分配原始数据框。这里df
将被更改。
【参考方案1】:
您绝对可以使用诸如df <- df %>% ...
或df %>% ... -> df
之类的习语来完成作业。但是您也可以通过在管道开头使用magrittr
复合赋值运算符%<>%
来避免冗余(即声明df
两次)。
来自magrittr
小插图:
复合赋值管道运算符
%<>%
可用作链中的第一个管道。效果将是管道的结果被分配给左侧对象,而不是像往常一样返回结果。
所以用你的代码,我们可以做到
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%<>% colnames(df)<-vector_columnnames%>% slice(-c(1:3))%>% select(-c(Col1,Col50,Col51))
对于后续问题,我深表歉意,但由于此线程可能对其他人有用,因此我将其放在这里。如果我想进行不属于 dplyr/magittr 包中函数的向量分配,例如 df%<>% vector_columnnames<-sprintf("Col%d",1:length(df))%>% set_colnames(vector_columnnames) %>% slice(-c(1:3))%>% # 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 管道的一部分,将中间输出分配给 temp 变量