2

これはそれほど難しいことではないようですが、私はこれに苦労しています。たとえば、次のデータフレームがあるとします。

set.seed(99)
data <- data.frame(Names=rep(c('A','B'),5),
                   First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10))

私が欲しいのは、データフレーム全体をAの平均で割ることです。これは次のように計算できます。

a.mean <-sapply(data [data $ Names =='A'、2:4]、mean)

しかし、このようにデータフレーム全体をそのベクトルで除算しようとすると、正しい値が得られません。

normalized.data <- data[2:4]/a.mean
normalized.data$Names <- data$Names
sapply(data[normalized.data$Names == 'A', 2:4], mean)

First     Second      Third 
0.2578018 -0.5864073  0.1156760

私が望んでいたのは、Aの正規化された平均が1に等しくなることでした。これを行う方法はありますか?

4

3 に答える 3

4
set.seed(99)
data <- data.frame(Names=rep(c('A','B'),5),
                   First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10))

a.mean <- sapply(data[data$Names == 'A', 2:4], mean)
data[,2:4] <- sweep(data[,2:4],MARGIN=2,a.mean,"/")

(norm.mean <- sapply(data[data$Names == 'A', 2:4], mean))
## First Second  Third 
##     1      1      1 

Namesアプリケーションによっては、代わりに列を行名にする方が簡単な場合があります。

data <- data.frame(First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10),
                   row.names=rep(c('A','B'),5))

読みやすさも気に入っsubset(data,Names=='A')ています(プログラミングにはお勧めしませんが、https ://github.com/hadley/devtools/wiki/Evaluationを参照してください) 。

于 2013-02-28T14:16:24.513 に答える
2
set.seed(99)
data <- data.frame(Names=rep(c('A','B'),5),
                   First = rnorm(10),
                   Second = rnorm(10),
                   Third = rnorm(10))

a.mean <- colMeans(data[data$Names == 'A', 2:4])


normalized.data <- as.data.frame(t(t(data[,2:4])/a.mean))


normalized.data$Names <- data$Names
colMeans(normalized.data[normalized.data$Names == 'A', 1:3])

#First Second  Third 
#1      1      1 
于 2013-02-28T14:17:20.380 に答える
2

ああ、気にしないでください:あなたはあなたが思っている方法を分割していません。行列を値のベクトルで除算しても、各列は特定の値で除算されません。

Rgames> foo
     [,1] [,2] [,3]
[1,]    5    3    7
[2,]    5    3    7
[3,]    5    3    7
[4,]    5    3    7
[5,]    5    3    7
Rgames> foo/c(1,2,3)
         [,1] [,2]     [,3]
[1,] 5.000000  1.0 3.500000
[2,] 2.500000  3.0 2.333333
[3,] 1.666667  1.5 7.000000
[4,] 5.000000  1.0 3.500000
[5,] 2.500000  3.0 2.333333
于 2013-02-28T14:20:58.783 に答える