2016-07-19 18 views
3

の要素をmatrixに置き換え、simplify2arrayを使用してrowMeansを計算します。回避策はrowMeans(matrix(as.numeric(bar_new), ncol = ncol(bar_new)))だろう。もちろん、簡易行列を作成して数値行列を作成する

bar <- list(list(11, 21, 31), list(12, 22, 32)) 

bar_new <- simplify2array(bar) 
#gives[,1] [,2] 
#[1,] 11 12 
#[2,] 21 22 
#[3,] 31 32 
rowMeans(bar_new) 
#gives Error: 'x' must be numeric 
# does not work as all elements in foo are lists - see class(bar_new[1, 1]) 

:問題はsimplify2arrayがクラスlistのbeeingて要素と、matrixを生成しないnumericということです。しかし、私はそれを短くてシンプルにしたい。だから問題は:simplify2arrayを "数値"マトリックスを生成するにはどうすればいいですか?


完全を期すため、予想される出力は次のようになります。

foo <- matrix(c(11, 12, 21, 22, 31, 32), byrow = TRUE, nrow = 3) 

#gives [,1] [,2] 
#[1,] 11 12 
#[2,] 21 22 
#[3,] 31 32 

rowMeans(foo) 
#gives 11.5 21.5 31.5 
# works as all elements in foo are numeric - see class(foo[1, 1]) 

答えて

2

せずに別の方法これを行うことができます。

mode(bar_new) <- "numeric" 
rowMeans(bar_new) 
# [1] 11.5 21.5 31.5 
+0

をそれだけではなく、答えとして、私はこの答えを受け入れ私の質問ですが、私はまた、オブジェクトのモードをどのように使用し、変更するかを学びました。 – Qaswed

+0

@Qaswed、 'mode'の代わりに' storage.mode'を使うかもしれないことに注意してください。おそらくもっと直感的です。 – Julius

1

simplify2arrayは、ネストされたリストでは動作しないようです。ここで

simplify2arrayを使用するソリューション(愚かなの一種)の2つです:

cbind(simplify2array(bar[[1]]), simplify2array(bar[[2]])) 
    [,1] [,2] 
[1,] 11 12 
[2,] 21 22 
[3,] 31 32 

または

もちろん
matrix(simplify2array(unlist(bar, recursive=F)), 3) 
    [,1] [,2] 
[1,] 11 12 
[2,] 21 22 
[3,] 31 32 

、あなたが知っていれば、その各リストのベクトルの長さアイテムが等しい場合は、unlistmatrixを使用して、@ akrunのソリューションの一部を一般化することができます:

matrix(unlist(bar), ncol=length(bar)) 

これは以前の方法よりも読み易く、リストと共に成長します。ここで

1

はそれを行うための一つの方法である:

simplify2array(Map(unlist, bar)) 
#  [,1] [,2] 
# [1,] 11 12 
# [2,] 21 22 
# [3,] 31 32 

str(simplify2array(Map(unlist, bar))) 
# num [1:3, 1:2] 11 21 31 12 22 32 

rowMeans(simplify2array(Map(unlist, bar))) 
# [1] 11.5 21.5 31.5 
1

我々はsimplify2array

rowMeans(matrix(unlist(bar), ncol=2)) 
#[1] 11.5 21.5 31.5 
関連する問題