R:如果另一行数组满足条件(如excel,但在R中),则对一行数组求和

Lys*_*cks -1 r sumifs data.table

比方说,我有5个人A:E的数据.这些人提供了他们愿意以四个频段以什么价格购买的数量的信息.数据格式宽泛.

df = cbind.data.frame(Q1 = c(90,50,20,10,10), Q2 = c(110,0,0,0,0),
                      Q3 = c(60,60,50,20,5), Q4 = c(20,10,0,0,0), 
                      P1 = 2:6, P2 = c(3,6,8,9,10),
                      P3 = c(2,3,5,7,9), P4 = 1:5)
row.names(df) = LETTERS[1:5]
Run Code Online (Sandbox Code Playgroud)

(我的实际数据集在很多时间段内对个人有很多观察,并且有更多的乐队).

我想要做的是为每个人,他们愿意在特定价格类别内购买的数量求和.

假设我想要以0美元和5美元之间的任何价格总结个人愿意消费的所有数量,并且类似地在5美元到10美元之间的价格类别.使用excel我会使用一个简单的'sumifs'来做到这一点.

我怎么能在R中这样做?

我期望从上面的数据输出将是:

  0<P<=5   5<P<=10 
A 280      0 
B 120      0 
C 70       0
D 10       20 
E 0        15
Run Code Online (Sandbox Code Playgroud)

我通常一直在使用data.table,所以如果有人知道使用这个软件包的解决方案会很好.我也试过通过重塑数据来做到这一点,但它变得太大而无法处理(警告消息等),所以它需要保持这种格式.

谢谢!

mts*_*mts 5

我复制了你的数据集,它应该是这样的:

df = cbind.data.frame(Q1 = c(90,50,20,10,10), Q2 = c(110,0,0,0,0),
                      Q3 = c(60,60,50,20,5), Q4 = c(20,10,0,0,0), 
                      P1 = 2:6, P2 = c(3,6,8,9,10),
                      P3 = c(2,3,5,7,9), P4 = 1:5)
row.names(df) = LETTERS[1:5]
Run Code Online (Sandbox Code Playgroud)

请始终以易于使用的方式分享您的数据,请在此处查看相关提示.

现在你不需要data.table(但肯定会有一个data.table方法),我将在这里向你展示一个基本的R解决方案:

df.q = df[,1:4]
df.p = df[,5:8]
Run Code Online (Sandbox Code Playgroud)

我将数据框分成了价格和需求.由于它们具有相同的格式,因此您可以sum在条件为真的索引处编号:编辑:更新问题后,这是基本的R解决方案:

sapply(1:5, function(x) sum(cbind(0, df.q[x, df.p[x,] <= 5])))
sapply(1:5, function(x) sum(cbind(0, df.q[x, df.p[x,] > 5 & df.p[x,] <= 10])))
Run Code Online (Sandbox Code Playgroud)

结果是:

> df.q
  Q1  Q2 Q3 Q4
A 90 110 60 20
B 50   0 60 10
C 20   0 50  0
D 10   0 20  0
E 10   0  5  0
> df.p
  P1 P2 P3 P4
A  2  3  2  1
B  3  6  3  2
C  4  8  5  3
D  5  9  7  4
E  6 10  9  5
> sapply(1:5, function(x) sum(cbind(0, df.q[x, df.p[x,] <= 5])))
[1] 280 120  70  10   0
> sapply(1:5, function(x) sum(cbind(0, df.q[x, df.p[x,] > 5 & df.p[x,] <= 10])))
[1]  0  0  0 20 15
Run Code Online (Sandbox Code Playgroud)