我有一个这样的数据框:
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]))
但它没有给我我想要的东西。
答案 0 :(得分:9)
你快到了。
with(my.df, sum(my.df[A >= 1 & A < 3, "B"]))
修改的
Chase挑战我解释手头的代码。阅读R代码时,最好从内向外读取。我们走了。
my.df
是一个包含A
和B
列的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$A
和my.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