【问题标题】:How to apply same operation to multiple data frames in dplyr-R?如何对 dplyr-R 中的多个数据帧应用相同的操作?
【发布时间】:2018-11-24 06:41:57
【问题描述】:

我想对“R”中的多个数据帧应用相同的操作,但不知道如何处理这个问题。

这是dplyrpipe操作的示例:

library(dplyr)

    iris %>% mutate(Sepal=rowSums(select(.,starts_with("Sepal"))),
                    Length=rowSums(select(.,ends_with("Length"))),
                    Width=rowSums(select(.,ends_with("Width"))))
iris2 <- iris
iris3 <- iris

您能否建议如何将相同的管道函数应用于irisiris2isis3?我需要使用dplyr管道操作。

我想map 函数可能会有所帮助,但由于我还没有完全理解它的概念,所以我在应用它时遇到了错误。

示例脚本:

library(purrr)

iris.set <- c(iris,iris2,iris3)
map(iris.set, ~ . %>% mutate(Sepal=rowSums(select(.,starts_with("Sepal"))),
                Length=rowSums(select(.,ends_with("Length"))),
                Width=rowSums(select(.,ends_with("Width")))))

【问题讨论】:

  • 进行以下更改:iris.set &lt;- list(iris,iris2,iris3)map(iris.set, ~ .x %&gt;% mutate(Sepal=rowSums(select(.,starts_with("Sepal"))), Length=rowSums(select(.,ends_with("Length"))), Width=rowSums(select(.,ends_with("Width")))))
  • @CPak 太好了!所以如果我需要单独保留这些数据框,我需要取消列出iris.set
  • 单独保存是什么意思?
  • 我的意思是结果列表包含 3 个数据框,irisiris2iris3。我需要它们返回 3 个数据帧,再次存储在 data.frame,而不是 list。我为这个特定问题创建了新帖子。 stackoverflow.com/questions/50860018/…

标签: r dplyr data-manipulation tidyverse


【解决方案1】:

如果你把你的操作变成一个函数:

library(dplyr)
my_fun <- function(x) { 
      x %>%       
          mutate(Sepal=rowSums(select(.,starts_with("Sepal"))),
          Length=rowSums(select(.,ends_with("Length"))),
          Width=rowSums(select(.,ends_with("Width"))))
}

您可以轻松地将数据帧列表传递给它:

result <- list( iris, iris2, iris3 ) %>%
    lapply( my_fun )

【讨论】:

  • 感谢您的建议,但我更愿意继续使用dplyr,以便按照@www 的建议进行操作。
  • 嗨@rosscova - 我可以用什么方法替换现有的“iris”数据框而不是将它们组合成“结果”?
【解决方案2】:

对你有好处吗?

    library(dplyr)

    #matrices replication 
    iris1=iris
    iris2=iris
    iris3=iris

    #list of combinations: apply is tricky for array input
    irises=matrix(c("iris1","iris2","iris3"), ncol=1)

    #function design
    Funct<-function(df_name){

      df=get(df_name)
      df %>% mutate(Sepal=rowSums(select(.,starts_with("Sepal"))),
                    Length=rowSums(select(.,ends_with("Length"))),
                    Width=rowSums(select(.,ends_with("Width"))))
    }

    apply(irises,MARGIN=2, Funct)

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2016-12-25
    • 2014-03-27
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多