在另一列定义的间隔之间的列中汇总对象

时间:2011-05-05 11:01:15

标签: r

我有一个这样的数据框:

  df
       A B
 [1,]  1 4
 [2,]  2 3
 [3,]  3 5
 [4,]  4 7
 [5,]  5 5
 [6,]  6 7
 [7,]  7 4
 [8,]  8 7
 [9,]  9 3
[10,] 10 7

我需要将B列中的数字加到A列定义的特定区间之间。例如,将A中的数值加到A≥1和A <3之间。

我正在尝试使用它:

> sum(which(df$B[df$A>=1] & df$B[df$A<3]))

但它没有给我我想要的东西。

2 个答案:

答案 0 :(得分:9)

你快到了。

with(my.df, sum(my.df[A >= 1 & A < 3, "B"]))

修改

Chase挑战我解释手头的代码。阅读R代码时,最好从内向外读取。我们走了。

my.df是一个包含AB列的data.frame(想想Excel表)。方括号[]用于对此对象中的任何进行子集,如下所示:[rows, columns]。例如,[1, ]将返回整个第一行,如果添加列号(或列名称),则会在该列的第一行中获取值(例如[1, 2],您将在其中获得值在第二列的第一行)。 我们现在将my.df中的行与A >= 1 & A < 3进行对。我们在这里说的是我们希望看到A中的值大于或等于1且小于3的行。这将为我们提供满足此条件的所有行。如果我们添加, "B",则表示我们要选择列B。由于我们已经将结果子集化为仅包含符合上述标准的行,因此通过输入列名B,我们只在列中获取值。获得B列中的值后,您可以使用sum()对它们求和。 使用with功能可以让我们的生活更轻松。如果我们没有使用它,我们将被迫按其全名my.df$Amy.df$B来调用列。

答案 1 :(得分:2)

使用子集中的select参数的另一个选项可以获得相同的结果。 :sum(subset(dat, A < 3 & A >= 1, select = "B"))

Roman的答案更快,但可以说不容易向非R专家解析。根据您的受众(即与同事共享脚本)和性能限制,可能优先考虑另一个。

> system.time(replicate(100,with(dat, sum(dat[A >= 1 & A < 3, "B"]))))
   user  system elapsed 
  0.008   0.000   0.008 
> system.time(replicate(100, sum(subset(dat, A < 3 & A >= 1, select = "B"))))
   user  system elapsed 
  0.041   0.000   0.041