在R data.frame中创建一个新列的最方便的方法是包含一个因子的值与另一个因子的值,例如:
FAC1 FAC2 VALUE SHARES
OBS1 A X V1 V1/(V1+V2+V3)
OBS2 A Y V2 V2/(V1+V2+V3)
OBS3 A Z V3 V3/(V1+V2+V3)
OBS4 B X V4 V4/(V4+V5+V6)
OBS5 B Y V5 V5/(V4+V5+V6)
OBS6 B Z V6 V6/(V4+V5+V6)
所以在我的data.frame中我除了要创建的列之外还有其他所有内容。
答案 0 :(得分:2)
假设mydf
是您的数据框,您可以使用:
mydf$VALUE/ave(mydf$VALUE,mydf$FAC1,FUN=sum)
一个例子,因为你还没有给我们数据:
mydf <- data.frame(FAC1=rep(letters[1:3],each=3),VALUE=sample(1:10,9))
mydf$SHARES <- mydf$VALUE/ave(mydf$VALUE,mydf$FAC1,FUN=sum)
> mydf
FAC1 VALUE SHARES
1 a 6 0.3529412
2 a 8 0.4705882
3 a 3 0.1764706
4 b 4 0.1904762
5 b 10 0.4761905
6 b 7 0.3333333
7 c 2 0.2500000
8 c 1 0.1250000
9 c 5 0.6250000
答案 1 :(得分:1)
以下是使用plyr包中的ddply
的两步解决方案:
library(plyr)
mydf1<-ddply(mydfm,.(FAC1),transform, sumfac1=sum(VALUE))
mydf1<-ddply(mydf1,.(FAC1,FAC2),transform,SHARES=VALUE/sumfac1)
答案 2 :(得分:0)
library(data.table)
dt = data.table(FAC1 = rep(letters[1:3], each = 6),
FAC2 = rep(LETTERS[1:3], each = 2),
VALUE = 1:18)
dt[, {FAC1.sum = sum(VALUE); .SD[, sum(VALUE)/FAC1.sum, by = FAC2]}, by = FAC1]
# FAC1 FAC2 V1
#1: a A 0.1428571
#2: a B 0.3333333
#3: a C 0.5238095
#4: b A 0.2631579
#5: b B 0.3333333
#6: b C 0.4035088
#7: c A 0.2903226
#8: c B 0.3333333
#9: c C 0.3763441