【问题标题】:subset a dataframe based on sum of a column根据列的总和对数据框进行子集化
【发布时间】:2014-12-04 13:30:44
【问题描述】:

我有一个看起来像这样的 df:

> df2
  name      value
1    a 0.20019421
2    b 0.17996454
3    c 0.14257010
4    d 0.14257010 
5    e 0.11258865
6    f 0.07228970
7    g 0.05673759
8    h 0.05319149
9    i 0.03989362

我想使用value 列的总和对其进行子集化,即我想提取那些从列value 中的值总和高于0.6 的行,但开始对第一行的值求和.我想要的输出是:

> df2
  name      value
1    a 0.20019421
2    b 0.17996454
3    c 0.14257010
4    d 0.14257010

我已经尝试过df2[, colSums[,5]>=0.6],但显然 colSums 期待的是 array

提前致谢

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    这是一种方法:

     df2[seq(which(cumsum(df2$value) >= 0.6)[1]), ]
    

    结果:

      name     value
    1    a 0.2001942
    2    b 0.1799645
    3    c 0.1425701
    4    d 0.1425701
    

    【讨论】:

      【解决方案2】:

      我不确定我是否理解完全您想要做什么,但我认为cumsum 应该能够提供帮助。

      首先让这个可重现,让我们使用dput,以便其他人可以提供帮助:

      df <- structure(list(name = structure(1:9, .Label = c("a", "b", "c", 
      "d", "e", "f", "g", "h", "i"), class = "factor"), value = c(0.20019421, 
      0.17996454, 0.1425701, 0.1425701, 0.11258865, 0.0722897, 0.05673759, 
      0.05319149, 0.03989362)), .Names = c("name", "value"), class = "data.frame", row.names = c(NA, 
      -9L))
      

      然后看看cumsum(df$value)提供了什么:

      cumsum(df$value)
      # [1] 0.2001942 0.3801587 0.5227289 0.6652990 0.7778876 0.8501773 0.9069149 0.9601064 1.0000000
      

      最后,相应的子集:

      subset(df, cumsum(df$value) <= 0.6)
      #   name     value
      # 1    a 0.2001942
      # 2    b 0.1799645
      # 3    c 0.1425701
      
      subset(df, cumsum(df$value) >= 0.6)
      #   name      value
      # 4    d 0.14257010
      # 5    e 0.11258865
      # 6    f 0.07228970
      # 7    g 0.05673759
      # 8    h 0.05319149
      # 9    i 0.03989362
      

      【讨论】:

      • 谢谢,我忘了cumsum
      猜你喜欢
      • 2013-08-15
      • 2019-09-29
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2016-12-15
      • 2013-03-17
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多