1

わかりましたので、提起するのが難しいとわかったものではありますが、単純な質問である可能性が非常に高いものがあります(それが問題の根本である可能性があります)。

次のサンプルデータがある場合:

    V1 <- c(1,1,1,1,1,2,2,2,2,2)
    factor <- factor(V1)
    V2 <- c(1,2,3,4,5,6,7,8,9,10)
    V3 <- c(10,20,30,40,50,60,70,80,90,100)
    test <- data.frame(factor,V2,V3)

別の変数、たとえば V4 を生成するにはどうすればよいでしょうか。これは因子の各レベルの V3 の平均です。たとえば、tapply を使用して平均値を取得できます。

    tapply(test$V3, test$factor, FUN=mean)

この場合、それぞれ 30 と 80 になりますが、次のように、関連する因子レベルの長さの繰り返し変数を形成したいと考えています。

      factor V2  V3 v4
   1       1  1  10 30
   2       1  2  20 30
   3       1  3  30 30
   4       1  4  40 30
   5       1  5  50 30
   6       2  6  60 80
   7       2  7  70 80
   8       2  8  80 80
   9       2  9  90 80
   10      2 10 100 80

提案や解決策があれば、質問をより適切に表現する方法とともに歓迎されます。

4

2 に答える 2

4

aveの代わりに使用tapply:

within(test, {
  V4 <- ave(V3, factor, FUN = mean)
})
   factor V2  V3 V4
1       1  1  10 30
2       1  2  20 30
3       1  3  30 30
4       1  4  40 30
5       1  5  50 30
6       2  6  60 80
7       2  7  70 80
8       2  8  80 80
9       2  9  90 80
10      2 10 100 80

構成は、使用した方法と非常によく似ていますtapply。これを使用withinした理由は 2 つあります。(1) 入力の手間を省くため、(2) 新しい列を自動的に作成できるようにするためです。


data.tableパッケージには、これらのタイプの操作に非常に便利な構文がいくつかあります。

> library(data.table)
data.table 1.8.8  For help type: help("data.table")
> DT <- data.table(test)
> DT[, V4 := mean(V3), by = factor]
> DT
    factor V2  V3 V4
 1:      1  1  10 30
 2:      1  2  20 30
 3:      1  3  30 30
 4:      1  4  40 30
 5:      1  5  50 30
 6:      2  6  60 80
 7:      2  7  70 80
 8:      2  8  80 80
 9:      2  9  90 80
10:      2 10 100 80

読者を圧倒するつもりはありませんが、これを行う方法はたくさんあります。ベース R のソリューションをさらに 2 つ示します (ただし、既に共有されている代替ソリューションよりもはるかに効率的ではありません)。

aggregate

merge(test, 
      setNames(aggregate(V3 ~ factor, test, mean), 
               c("factor", "V4")), all = TRUE)

tapplyあなたのアウトプットを活かす。

temp <- tapply(test$V3, test$factor, FUN=mean)
temp <- data.frame(V4 = temp)
merge(test, temp, by.x = "factor", by.y = "row.names", all = TRUE)
于 2013-04-18T12:02:49.863 に答える
1

これが解決策plyrです:

R> ddply(test, .(factor), transform, V4=mean(V3))
   factor V2  V3 V4
1       1  1  10 30
2       1  2  20 30
3       1  3  30 30
4       1  4  40 30
5       1  5  50 30
6       2  6  60 80
7       2  7  70 80
8       2  8  80 80
9       2  9  90 80
10      2 10 100 80
于 2013-04-18T12:04:53.953 に答える