【问题标题】:sum of rows when condition is met- data.frame in R条件满足时的行总和-R中的data.frame
【发布时间】:2020-06-10 13:48:47
【问题描述】:
df
  var1 var2
1    a    1
2    b    2
3    a    3
4    c    6
5    d   88
6    b    0

df2 <- data.frame(var1=c("k","b","a","k","k","b"),var2=c(14,78,5,6,88,0))
> list <- list(df,df2)

for(i in list){
   if(any(i[ ,1] == i[ ,1})){
      cumsum(.)
   }
}

我有一个包含 data.frames 的列表。我想遍历这些data.frames。当第一列有相同的字母时,则应计算总和。我希望这个新行出现在我的 data.frame 中。 我完全搞砸了if statement。有人可以帮帮我吗?

编辑:结果应该是这样的

df
  var1 var2
1 a    4
2 b    2
3 c    6
4 d    88

对于 df2

var1 var2
1    k   108
2    b   78
3    a    5

在我真正的问题中,列表由 10 个 data.frames 组成,而不仅仅是两个

【问题讨论】:

  • 你能举一个你期望的结果的例子吗?

标签: r dataframe for-loop if-statement


【解决方案1】:

在 Base-R 中

sapply(split(df$var2,df$var1), sum)

 a  b  c  d 
 4  2  6 88 

或对数据框列表的每个元素执行此操作

lapply(list, function(x) sapply(split(x$var2,x$var1), sum))

[[1]]
 a  b  c  d 
 4  2  6 88 

[[2]]
  a   b   k 
  5  78 108 

【讨论】:

    【解决方案2】:

    这有点难以理解,但是在你给出结果之后,我认为这就是你要找的:将 df 分组,然后总结

    library(tidyverse)
    
    df2 <- data.frame(var1=c("k","b","a","k","k","b"),var2=c(14,78,5,6,88,0))
    
    df <- tibble::tribble(
      ~var1, ~var2,
      "a",    1,
      "b",    2,
      "a",    3,
      "c",    6,
      "d",   88,
      "b",    0
    )
    
    
    df %>% 
      group_by(var1) %>% 
      summarise(sum = sum(var2))
    #> # A tibble: 4 x 2
    #>   var1    sum
    #>   <chr> <dbl>
    #> 1 a         4
    #> 2 b         2
    #> 3 c         6
    #> 4 d        88
    df2 %>% 
      group_by(var1) %>% 
      summarise(sum = sum(var2))
    #> # A tibble: 3 x 2
    #>   var1    sum
    #>   <chr> <dbl>
    #> 1 a         5
    #> 2 b        78
    #> 3 k       108
    

    由reprex package (v0.3.0) 于 2020-06-10 创建

    在基础 R 中你可以这样做

    aggregate(df$var2, by=list(df$var1), FUN=sum)[2]
    

    我花了一段时间才明白您想从数据框列表开始执行此操作。在这种情况下,您可以以 tidyverse 方式定义您的函数并应用 purrr:map

    dflist <- list(df, df2)
    df_sum <- function(df){
      df %>% 
        as.data.frame() %>% 
        group_by(var1) %>% 
        summarise(sum = sum(var2))
    }
    
    purr::map(dflist,tt)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2013-10-19
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      相关资源
      最近更新 更多