3

私のデータフレームは次のようになります。

> df
  id u.1t u.2 v.1 v.2
1  A    1  NA   5  NA
2  A    2  NA   4   6
3  A    1   4   5  NA
4  B   10  13  40  NA
5  B   10  12  42  NA
6  B   10  NA  41  NA

そして、私はそれぞれ次のような列と列のid固有の手段を知りたいです:u.*v.*

> mean
  id u.mean v.mean
1  A      2      5
2  B     11     41

これがデータです

df<-data.frame(id=c("A","A","A","B","B","B"),u.1t=c(1,2,1,10,10,10),u.2=c(NA,NA,4,13,12,NA),v.1=c(5,4,5,40,42,41),v.2=c(NA,6,NA,NA,NA,NA))

明らかなように、NAを導入することにより、全体の平均は行または列の平均の平均と等しくなくなります。これがここでの問題です。

これはの仕事だと思っていたのですが、列単位の操作しかbyできないことbyがわかりましたか?

ヘルプは大歓迎です-ありがとう

4

2 に答える 2

5

を使用したい場合はby、次のようにしてみてください。

by(x, x$id, function(x) colMeans(x[,-1], na.rm=TRUE))

出力は少し醜いです。あなたはそれを片付けることができますが、私はplyrパッケージを使用します:

library(plyr)
ddply(x, .(id), function(x) colMeans(x[,-1], na.rm=TRUE))

これは、各列の平均を取るため、目的の結果を完全に達成することはできません。列u.*v.*列を組み合わせることはありません。そのためにはmelt、最初にデータを使用してから、次を使用しますplyr

library(reshape2)
y <- melt(x)
y$variable <- gsub("\\..*", '', y$variable)
y
#   id variable value
#1   A        u     1
#2   A        u     2
#3   A        u     1
#4   B        u    10
#5   B        u    10
#6   B        u    10
#7   A        u    NA
#    (etc)

z <- ddply(y, .(id, variable), summarise, mean = mean(value, na.rm=TRUE))
z
#  id variable mean
#1  A        u    2
#2  A        v    5
#3  B        u   11
#4  B        v   41

cast必要に応じて、これを元に戻すことができます。

dcast(z, id~variable)
#  id  u  v
#1  A  2  5
#2  B 11 41    
于 2012-09-19T11:56:15.433 に答える
0

ショーンはそれを正しく理解しました。彼の解決策は完璧に機能します。

しかし、変数名のパターン置換は不便であることが多く、適用できない(私の場合のように-例ではありません)、または単にすべての人のお茶ではないため、u'sからを区別するための新しい要素を導入することもできv'sます。castすぐに答えを出します(必要ありませんplyr):

require(reshape2)

y<-melt(df)
y$x[y$variable %in% c("u.1t","u.2")]<-"u"
y$x[y$variable %in% c("v.1","v.2")]<-"v"
y 
#   id variable value x
#1   A     u.1t     1 u
#2   A     u.1t     2 u
#3   A     u.1t     1 u
#4   B     u.1t    10 u
#5   B     u.1t    10 u
# ...
#22  B      v.2    NA v
#23  B      v.2    NA v
#24  B      v.2    NA v

dcast(y,y$id~x,mean, na.rm=T)
#  y$id  u  v
#1    A  2  5
#2    B 11 41

新しく作成された列を因数分解する必要もありませんy$x

> sapply(y, class)
        id    variable       value           x 
  "factor"    "factor"   "numeric" "character" 
于 2012-09-20T11:22:58.397 に答える