1

Rの行ごとの行列演算に従って、私が持っているdata.tableに行ごとの関数を適用したいと思います。行ごとに、その行の列数の平均を計算したいと思います。私の現在の試みは次のとおりです。

columns <- c(1,5,10,15,20) # Actually obtained via grep
my.data.table[,"average" := mean(columns),with=FALSE] # Or...
my.data.table[,average := mean(columns)]

残念ながら、これは、参照する列の平均ではなく、「列」ベクトルの平均を返すだけです。これらの列を番号で参照する方法はありますか?

これが私が達成しようとしている平均です:

key  a b c average
A    5 5 5 5
B    1 2 3 2
C    2 4 9 5
4

3 に答える 3

4

もう1つの方法は、実際に実行したい呼び出しを作成してから、内に作成eval()することですDT[]。これは、data.table FAQのセクション1.5および1.6で説明されている戦略です(入力して表示vignette("datatable-faq"))。

このアプローチは、を含むアプローチよりも3〜5倍高速に実行されrowMeans()ます。(この不一致はrowMeans()、Matthew Dowleが以下のコメントで指摘しているように、data.framesから行列への最初の時間のかかる変換によるものです。)

## Prepare data
library(data.table)
N <- 1000000
DT <- data.table(ID = 1:N,
                 Year1 = rnorm(N),
                 Year2 = rnorm(N),
                 Year3 = rnorm(N),
                 Year4 = rnorm(N))    
x <- c(2, 3, 4, 5)

## Construct the desired expression:   (Year1 + Year2 + Year3 + Year4)/4
addCols <- paste(names(DT)[x], collapse = " + ")
e <- paste("(", addCols, ")/", length(x), sep="")
e <- parse(text=e)[[1]]

## Compare timings
system.time(x2 <- DT[,eval(e)])
#    user  system elapsed 
#    0.11    0.00    0.11 
system.time(x1 <- rowMeans(DT[, ..x]))
#    user  system elapsed 
#    0.53    0.14    0.77 

## Check results
# all.equal(x1,x2)
# [1] TRUE
于 2012-05-25T16:06:06.570 に答える
3

ここに2つの可能な解決策があります。それらは基本的に両方ともあなたがすでに提供したリンクからのものなので、多分私はこの質問で何かを逃しました。どうぞ:

解決策1(を使用rowMeans):

library(data.table)
N <- 1000000
my.data.table <- data.table(ID = 1:N,
                            Year1 = rnorm(N),
                            Year2 = rnorm(N),
                            Year3 = rnorm(N),
                            Year4 = rnorm(N))

x <- c(2, 3, 4, 5)
system.time(x1 <- rowMeans(my.data.table[, ..x]))
   user  system elapsed 
   0.08    0.00    0.08

解決策2:最初に長い形式にします。これは、主に構文data.table用であるという他の質問でのMatthewのコメントのために、より高速だと思いました。DT[,mad(variable),by=group]私は何かが欠けていると思いますが、何がわかりません:

library(reshape2)
DT <- as.data.table(melt(as.data.frame(my.data.table), id.var="ID"))
setkey(DT, ID)
system.time(x2 <- DT[, mean(value), by="ID"][[2]])
   user  system elapsed 
  11.28    0.00   11.33 
all.equal(x1, x2)
[1] TRUE
于 2012-05-25T14:36:12.510 に答える
1

わかりました...

これは大丈夫でしょうか

x<-1:5
y<-1:5
z<-1:5
xy<-data.table(x,y,z)
id<-c("x","y")
newxy<-rowMeans(xy[, id, with=FALSE])
于 2012-05-25T14:02:45.630 に答える