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



比如说,我有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]

(我的实际数据集在许多时间段对个人进行了许多观察,并且有更多的波段)。

我想做的是对每个人在特定价格类别下愿意购买的数量求和。

假设我想计算一个人在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

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

谢谢!

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

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]

请始终以易于使用的方式分享您的数据,查看此处获取想法。

现在你不需要数据了。为此表(但肯定会有数据)。),我将在这里向您展示一个基本的R解决方案:

df.q = df[,1:4]
df.p = df[,5:8]

我把你的数据框分成了价格和需求。由于它们具有相同的格式,因此您可以在条件为真的索引上对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])))

结果是:

> 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

我们将以'Q'开头的列和以' p '开头的列分别子集,以创建两个数据集('dfQ', 'dfP')。然后,我们得到一个逻辑矩阵((dfP > 0 & dfP <=5), (dfP > 5 & dfP <=10)),并将(*)与"dfQ"数据集相乘。逻辑矩阵中的TRUE/FALSE值将被强制为1/0整数值,以便与FALSE/0对应的dfQ元素在乘法后将为0,而与逻辑矩阵中TRUE/1元素对应的dfQ元素将保持不变。然后,执行rowSums以获得预期的输出。

 dfQ <- df[grep('^Q', names(df))]
 dfP <- df[grep('^P', names(df))]
 Sum0_5 <- rowSums(dfQ*(dfP > 0 & dfP <=5))
 Sum5_10 <- rowSums(dfQ*(dfP > 5 & dfP <=10))
 cbind(Sum0_5, Sum5_10)
 #  Sum0_5 Sum5_10
 #A    280       0
 #B    120       0
 #C     70       0
 #D     10      20
 #E      0      15

最新更新