2016-07-28 1 views
0

私はこれのような大きなdfを持っています(これはその一部です)。各サンプル(A、B、Cなど)には3つの値(R、H、L)があります。文字列を共有するすべての列を持つrowMeans

私はこの例では、各サンプルについて rowMeansで新しいDFを作成したい
IDs R.A R.B R.C H.A H.B H.C L.A L.B L.C 
A 6 5 4 5 5 5 5 1 4 
B 2 5 3 3 4 3 5 5 6 
C 6 6 3 2 2 1 4 1 3 
D 2 1 6 3 5 3 3 6 5 
E 4 1 3 2 3 1 4 4 4 
F 3 1 1 1 4 4 2 6 4 

:私は

IDs mean.A mean.B mean.C 
    A 3.0 5.0 3.0 
    B 5.7 5.3 4.7 
    C 3.0 4.7 4.7 
    D 3.0 1.7 5.3 
    E 3.3 4.0 4.3 
    F 4.0 2.3 4.0 

私は、この例のためにそれを行う方法を知っているが、私はそれらの百を持っており、文字列を手動で指定することはできません(A、B、C)。

newcols <- sapply(c("A$", "B$", "C$"), function(x) rowMeans(df[grep(x, names(df))])) 
setNames(cbind(df[1], newcols), c(names(df)[1], "mean.A", "mean.B", "mean.C")) 

"文字列"を指定せずに "文字列"を共有するすべての列で操作を行う方法はありますか?

findThese <- unique(sub(pattern = "^[RHL]\\.(.+)$", 
         replacement = "\\1", 
         x = colnames(df)[!names(df) == "IDs"], # don't grab IDs column 
         perl = TRUE)) 

は、その後、あなたが見つかったユニークなサンプルを使用:あなたは一定のパターンを持っているので

答えて

1

R.H.または関心の文字列が続いL.は、あなたを介して見る必要があるすべての固有のサンプルを抽出するためにパターンを使用しますあなたのコード内(findThese):

newcols <- sapply(paste0(findThese, "$"), function(x) rowMeans(df[grep(x, names(df))])) 
setNames(cbind(df[1], newcols), c(names(df)[1], paste0("mean", findThese))) 
# IDs mean.A mean.B mean.C 
#1 A 5.333333 3.666667 4.333333 
#2 B 3.333333 4.666667 4.000000 
#3 C 4.000000 3.000000 2.333333 
#4 D 2.666667 4.000000 4.666667 
#5 E 3.333333 2.666667 2.666667 
#6 F 2.000000 3.666667 3.000000 
5

名前の変更あなたはGroup.[RHL]を持っていることを、長い形式に溶けるので、その後、aggregate

names(dat) <- sub("^(.+)\\.(.+)$", "\\2.\\1", names(dat)) 
long <- reshape(dat, idvar="IDs", direction="long", sep=".", varying=-1, timevar=NULL) 
aggregate(. ~ IDs, data=long, FUN=mean) 

# IDs  A  B  C 
#1 A 5.333333 3.666667 4.333333 
#2 B 3.333333 4.666667 4.000000 
#3 C 4.000000 3.000000 2.333333 
#4 D 2.666667 4.000000 4.666667 
#5 E 3.333333 2.666667 2.666667 
#6 F 2.000000 3.666667 3.000000 

dplyrまたはdata.tableに同様のロジックを適合させることが難しいことではありません - しかし、私は今日、他の誰かのためにそれを残しておきます。

+1

@akrun - まったく - 私はそれがdata.tableできれいだと思う – thelatemail

1

は、ここでは、複数のmeasurepatternsを取り、その後、「IDが」でmeanを得るよう「長い」形式にdata.tablemeltへのデータセットを使用してオプションです。

library(data.table) 
melt(setDT(df1), measure = patterns("A$", "B$", "C$"), 
    value.name = c("A", "B", "C"))[,lapply(.SD, mean) , IDs, .SDcols = A:C] 
# IDs  A  B  C 
#1: A 5.333333 3.666667 4.333333 
#2: B 3.333333 4.666667 4.000000 
#3: C 4.000000 3.000000 2.333333 
#4: D 2.666667 4.000000 4.666667 
#5: E 3.333333 2.666667 2.666667 
#6: F 2.000000 3.666667 3.000000 
関連する問題