代码之家  ›  专栏  ›  技术社区  ›  HSJ

如何在dplyr-R中对多个数据帧应用相同的操作?

  •  1
  • HSJ  · 技术社区  · 7 年前

    我想对“R”中的多个数据帧应用相同的操作,但无法获得如何处理此问题的方法。

    这是一个例子 pipe 操作 dplyr :

    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
    

    你能建议一下如何将相同的管道功能应用到 iris , iris2 isis3 ? 我需要使用 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")))))
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   rosscova    7 年前

    如果你把你的手术变成一个功能:

    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 )
    
        2
  •  1
  •   Amara BOUDIB    7 年前

    对你有好处吗?

        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)