Groupwise在R数据框中共享

时间:2013-08-19 14:39:12

标签: r dataframe

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

3 个答案:

答案 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