0

在 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 中,除了要创建的 SHARES 列之外,我还有其他所有内容。

4

3 回答 3

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
于 2013-08-19T14:49:15.180 回答
1

ddply这是使用from plyr 包的两步解决方案:

library(plyr)
mydf1<-ddply(mydfm,.(FAC1),transform, sumfac1=sum(VALUE))
mydf1<-ddply(mydf1,.(FAC1,FAC2),transform,SHARES=VALUE/sumfac1)
于 2013-08-19T15:13:14.040 回答
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
于 2013-08-19T17:06:56.330 回答