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 に答える
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 に答える