【问题标题】:lapply aggregate columns in multiple dataframes Rlapply 聚合多个数据框中的列 R
【发布时间】:2018-02-10 13:21:02
【问题描述】:

我在 R 的列表中有几个数据框。我想总结的每个 DF 中都有条目。我正在尝试进入 lapply,所以这将是我的首选方式(尽管如果有更好的解决方案,我很乐意知道它以及为什么)。

我的样本数据:

df1 <- data.frame(Count = c(1,2,3), ID = c("A","A","C"))
df2 <- data.frame(Count = c(1,1,2), ID = c("C","B","C"))
dfList <- list(df1,df2)

> head(dfList)
[[1]]
  Count ID
1     1  A
2     2  A
3     3  C

[[2]]
  Count ID
1     1  C
2     1  B
3     2  C

我试图用 lapply 来实现这个

dfList_agg<-lapply(dfList, function(i) {
  aggregate(i[[1:length(i)]][1L], by=list(names(i[[1:length(i)]][2L])), FUN=sum)
})

但是这给了我一个错误“参数必须具有相同的长度”。我做错了什么?

我想要的输出是“ID”列“计数”的总和,如下所示:

>head(dfList_agg)
[[1]]
  Count ID
1     3  A
2     3  C

[[2]]
  Count ID
1     3  C
2     1  B

【问题讨论】:

    标签: r aggregate lapply


    【解决方案1】:

    我认为你过于复杂了。试试这个...

    dfList_agg<-lapply(dfList, function(i) {
      aggregate(i[,1], by=list(i[,2]), FUN=sum)
    })
    
    dflist_agg
    
    [[1]]
      Group.1 x
    1       A 3
    2       C 3
    
    [[2]]
      Group.1 x
    1       B 1
    2       C 3
    

    【讨论】:

    • i[,1] 表达式有什么作用?我的 i[[1:length(i)]][1L] 有什么不同吗(显然是的,因为你的代码可以工作;))
    • 它从数据框idfList 的元素之一)中选择第 1 列。在您的表达式中,1:length(i) 是多余的,因为它只是所有列,尽管通过使用 [[ 表示法,您将 df 视为列列表。我认为你的表达式也应该选择i 的第一列,但它可能是一个稍微不同的结构。我认为主要的问题是你的 by 表达式 - 主要是因为你只是使用名称(长度 1)而不是 ID 值的实际列。
    【解决方案2】:

    这是第三种选择

    lapply(dfList, function(x) aggregate(. ~ ID, data = x, FUN = "sum"))
    #[[1]]
    #  ID Count
    #1  A     3
    #2  C     3
    #
    #[[2]]
    #ID Count
    #1  B     1
    #2  C     3
    

    【讨论】:

      【解决方案3】:

      我想这就是你需要的

      library(dplyr)
      lapply(dfList,function(x) ddply(x,.(ID),summarize,Count=sum(Count)))
      

      【讨论】:

        【解决方案4】:

        tidyverse 的选项是

        library(tidyverse)
        map(dfList, ~ .x %>%
                        group_by(ID) %>% 
                        summarise(Count = sum(Count)) %>%
                        select(names(.x)))
        #[[1]]
        # A tibble: 2 x 2
        #   Count ID    
        #  <dbl> <fctr>
        #1  3.00 A     
        #2  3.00 C     
        
        #[[2]]
        # A tibble: 2 x 2
        #  Count ID    
        #  <dbl> <fctr>
        #1  1.00 B     
        #2  3.00 C     
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-18
          • 1970-01-01
          • 1970-01-01
          • 2022-07-07
          • 2016-01-13
          • 1970-01-01
          • 2017-05-24
          相关资源
          最近更新 更多