基于列的总和来子集数据帧

时间:2014-12-04 13:30:45

标签: r dataframe subset

我的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

提前致谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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