10

df名前列では重複しているが、値列では重複していない行を含むデータ フレームがあります。

name    value   etc1    etc2
A       9       1       X
A       10      1       X
A       11      1       X
B       2       1       Y
C       40      1       Y
C       50      1       Y

値列の平均を計算しながら、重複した名前を 1 つの行に集約する必要があります。予想される出力は次のとおりです。

name    value   etc1    etc2
A       10      1       X
B       2       1       Y
C       45      1       Y

私は使用しようとしましdf[duplicated(df$name),]たが、もちろん、これは重複の平均を与えません。を使用したいaggregate()のですが、問題は、この関数の FUN 部分が他のすべての列にも適用され、とりわけ char コンテンツを計算できないことです。他のすべての列は「重複」に対して同じ内容を持っているため、名前列と同じように集計する必要があります。ヒントは…?

4

4 に答える 4

14

ここにdata.table解決策があります。解決策は、60列のdata.frameでも機能するという意味で一般的です。値の異なるすべての変数でデータをグループ化するため (以下のキーの作成方法を参照)

library(data.table)
dat <- read.table(text='name    value   etc1    etc2
A       9       1       X
A       10      1       X
A       11      1       X
B       2       1       Y
C       40      1       Y
C       50      1       Y',header=TRUE)
keys <- colnames(dat)[!grepl('value',colnames(dat))]
X <- as.data.table(dat)
X[,list(mm= mean(value)),keys]
  name etc1 etc2 mm
1:    A    1    X 10
2:    B    1    Y  2
3:    C    1    Y 45

複数の変数に拡張するEDIT

平均を計算する数値変数が複数ある場合、たとえば、データが次のようになっている場合

  name value etc1 etc2     value1
1    A     9    1    X  2.1763485
2    A    10    1    X -0.7954326
3    A    11    1    X -0.5839844
4    B     2    1    Y -0.5188709
5    C    40    1    Y -0.8300233
6    C    50    1    Y -0.7787496

上記のソリューションは、次のように拡張できます。

X[,lapply(.SD,mean),keys]
   name etc1 etc2 value     value1
1:    A    1    X    10  0.2656438
2:    B    1    Y     2 -0.5188709
3:    C    1    Y    45 -0.8043865

これにより、キー リストに存在しないすべての変数の平均が計算されます。

于 2013-06-29T20:11:05.487 に答える
11

aggregate()以下のような関数を使用できます。

aggregate(df$value,by=list(name=df$name,etc1=df$etc1,etc2=df$etc2),data=df,FUN=mean)
于 2015-02-17T14:08:10.093 に答える