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