我在使用函数中的因素时遇到了一些麻烦,或者只是在基本计算中使用它们。我有一个像这样的数据框架(但有多达6000个不同的因素)。
df<- data.frame( p <- runif(20)*100,
q = sample(1:100,20, replace = T),
tt = c("e","e","f","f","f","i","h","e","i","i","f","f","j","j","h","h","h","e","j","i"),
ta = c("a","a","a","b","b","b","a","a","c","c","a","b","a","a","c","c","b","a","c","b"))
colnames(df)<-c("p","q","ta","tt")
现在price = p和quantity = q是我的变量,而tt和ta是不同的因素。
现在,我首先想要找出tt
中每个不同因素的每单位q的平均价格(p*q ) / sum(q) by tt
在这种情况下,这将给我一个3个不同总和的列表,a,b和c(我有6000个不同的因素,所以我需要聪明地做:))。
我尝试过使用拆分来制作清单,在这种情况下,我可以得到每个tt因子来包含价格而另一个包含数量,但是我似乎无法让它们达到平均值。我也试过使用tapply,但我再也看不出如何将因素纳入其中?
编辑:我可以看到我需要澄清:我需要找到3个总和,平均价格pr。给出每个因子,所以在这个简化的情况下它将是:
a:p * q的总和(行(1,2,3,7,11,13,14,18)/总和(行行的q(1,2,3,7,11,13, 14,18)
所以结果应该是a,b和c的平均价格,这只是3个值。
答案 0 :(得分:1)
我会使用plyr
来执行此操作:
library(plyr)
ddply(df, .(tt), mutate, new_col = (p*q) / sum(q))
p q ta tt new_col
1 73.92499 70 e a 11.29857879
2 58.49011 60 e a 7.66245932
3 17.23246 27 f a 1.01588711
4 64.74637 42 h a 5.93743967
5 55.89372 45 e a 5.49174103
6 25.87318 83 f a 4.68880732
7 12.35469 23 j a 0.62043207
8 1.19060 83 j a 0.21576367
9 84.18467 25 e a 4.59523322
10 73.59459 66 f b 10.07726727
11 26.12099 99 f b 5.36509998
12 25.63809 80 i b 4.25528535
13 54.74334 90 f b 10.22178577
14 69.45430 50 h b 7.20480246
15 52.71006 97 i b 10.60762667
16 17.78591 54 i c 5.16365066
17 0.15036 41 i c 0.03314388
18 85.57796 30 h c 13.80289670
19 54.38938 44 h c 12.86630433
20 44.50439 17 j c 4.06760541
plyr
因速度慢而闻名,data.table
提供类似的功能,但性能要高得多。
答案 1 :(得分:0)
如果我理解你的问题,这应该是答案。尝试并做出回应,如果需要,我可以调整它。
myRes <- function(tt) {
out <- NULL;
qsum <- sum(as.numeric(df[,"q"]))
psum <- sum(as.numeric(df[,"p"]))
for (var in tt) {
index <- which(df["tt"] == var)
out <- c(out, ((qsum *psum) / sum(df[index,"q"])))
}
return (out)
}
threeValue <- myRes(levels(df[, "tt"]));