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,所以如果有人知道使用这个软件包的解决方案会很好.我也试过通过重塑数据来做到这一点,但它变得太大而无法处理(警告消息等),所以它需要保持这种格式.
谢谢!
我复制了你的数据集,它应该是这样的:
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)