【问题标题】:sum of all rows when specific column is equal -data.frame in R当特定列相等时所有行的总和-R中的-data.frame
【发布时间】:2020-06-15 15:21:24
【问题描述】:
df
  var1 var2  var3
1    a    1  0.5
2    b    2  5
3    a    3  12
4    c    6  0
5    d   88  0
6    b    0  0

df2
  var1 var2  var3
1  k    1    0.5
2  l    0.6  5
3  k    3    12
4  k    6    0
5  v   12    0


> list <- list(df,df2)

for(i in list){
   i %>% 
  group_by(var1) %>% 
  summarise(sum = sum(var1))
}

每当var1 相等时,我希望对其余行求和,这将是新行。我希望data.frames 的列表仅包含具有唯一行的data.frames,但列应该加起来。我有来自这里的循环 sum of rows when condition is met- data.frame in R ,但我对答案并不满意。

结果应该是这样的

df
  var1 var2  var3
1    a    4  12.5
2    b    2  5
4    c    6  0
5    d   88  0

df2
  var1 var2  var3
1  k    10    12.5
2  l    0.6  5
3  v   12    0

我的真实列表包含很多data.frames,其中包含很多行和列。 谢谢

【问题讨论】:

    标签: r list dataframe if-statement


    【解决方案1】:

    整洁版:

    df <- read.table(text = "var1 var2  var3
    1    a    1  0.5
    2    b    2  5
    3    a    3  12
    4    c    6  0
    5    d   88  0
    6    b    0  0", stringsAsFactors = F, header = T)
    
    df2 <- read.table(text = "var1 var2  var3
    1  k    1    0.5
    2  l    0.6  5
    3  k    3    12
    4  k    6    0
    5  v   12    0", strings = F, header = T)
    
    
    l <- list(df = df, df2 = df2) # please use other name than "list"
    
    library(tidyverse)
    
    l <- map(l, ~.x %>%
             group_by(var1) %>%
             summarise_all(list(sum)) %>%
             ungroup())
    
    l
    
    # # A tibble: 4 x 3
    # var1   var2  var3
    # <chr> <int> <dbl>
    #   1 a         4  12.5
    # 2 b         2   5  
    # 3 c         6   0  
    # 4 d        88   0  
    # 
    # $df2
    # # A tibble: 3 x 3
    # var1   var2  var3
    # <chr> <dbl> <dbl>
    #   1 k      10    12.5
    # 2 l       0.6   5  
    # 3 v      12     0  
    

    【讨论】:

    • 使用dplyr 1.0.0 你可以使用across(): summarise(across(num_range("var", 2:3), sum), .groups="drop_last")
    【解决方案2】:

    base 中,您可以使用 aggregate in lapply 对每个组进行汇总。

    lapply(list, function(x) aggregate(.~var1, x, sum))
    #lapply(list, function(x) aggregate(x[,-1], as.list(x[1]), sum)) #Alternative
    #[[1]]
    #  var1 var2 var3
    #1    a    4 12.5
    #2    b    2  5.0
    #3    c    6  0.0
    #4    d   88  0.0
    #
    #[[2]]
    #  var1 var2 var3
    #1    k 10.0 12.5
    #2    l  0.6  5.0
    #3    v 12.0  0.0
    

    或在行名中使用rowsum 和组:

    lapply(list, function(x) rowsum(x[,-1], x[,1]))
    

    【讨论】:

      【解决方案3】:

      代码没问题,你只需要把它放在一个函数中并使用lapply。这里我使用了 data.table,但您也可以将该 dplyr 代码放在一个函数中,并将其用作lapply 的第二个参数。

      library(data.table)
      lapply(mylist, function(df) setDT(df)[, lapply(.SD, sum), var1])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2020-10-26
        相关资源
        最近更新 更多