2013-09-30 11 views
6

?stackのドキュメントの周りに私の頭を囲むことはできません。考えてみましょう。stack()の働きを理解するのに問題があります

> set.seed(1) 
> x1 = sample(c(letters[1:5], NA), size=10, replace=TRUE) 
> x2 = sample(c(letters[1:5], NA), size=10, replace=TRUE) 
> is.vector(x1) 
[1] TRUE 
> rbind(x1, x2) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
x1 "b" "c" "d" NA "b" NA NA "d" "d" "a" 
x2 "b" "b" "e" "c" "e" "c" "e" NA "c" "e" 
> stack(x1, x2) 
Error in rep.int(names(x), lapply(x, length)) : invalid 'times' value 
> stack(list(x1, x2)) 
Error in rep.int(names(x), lapply(x, length)) : invalid 'times' value 
> df = data.frame(x1=x1, x2=x2) 
> stack(df) 
Error in stack.data.frame(df) : no vector columns were selected 

は、私が欲しいものです:

values ind 
    "b" "x1" 
    "c" "x1" 
    "d" "x1" 
    NA "x1" 

    ... etc. 

答えて

7

xニーズという名前のリストであるために:最初のオフ、あなたがたときにスタックする行列引数を渡している、

stack(list(x1= x1,x2 = x2)) 
+2

リストだけでなく、_named_リスト(またはdata.frame)もあります。 –

+1

@JoshuaUlrichドキュメンテーションはおそらくそれについてもっと明確にすべきだと私は思います。 – joran

+0

私は同意しますが、誰かが来て、代わりにplyrを使うと言うので、それは議論の対象です。 :) –

4

まあそのヘルプページは次のように尋ねています:「積み重ねるか、または積み重ねるリストまたはデータフレーム」。さらに、stringsAsFactorsのデフォルト設定でデータフレームにすると、非常に情報のないエラーメッセージで失敗します。

d=data.frame(x1=x1,x2=x2) 
stack(d , select=c(x1,x2)) 
#Error in stack.data.frame(x, ...) : no vector columns were selected 


d=data.frame(x1=x1,x2=x2, stringsAsFactors=FALSE) 
stack(d , select=c(x1,x2)) 
#---------- 
    values ind 
1  b x1 
2  c x1 
3  d x1 
4 <NA> x1 
5  b x1 
6 <NA> x1 
7 <NA> x1 
8  d x1 
9  d x1 
10  a x1 
11  b x2 
12  b x2 
13  e x2 
14  c x2 
15  e x2 
16  c x2 
17  e x2 
18 <NA> x2 
19  c x2 
20  e x2 
+0

ええ、私もその順列を試して、&そのエラーメッセージを持っています。ご協力いただきありがとうございます。 – gung

+2

ファクタ列は、レベル属性を共有しないため簡単に積み上げることができないため、生の整数を積み重ねただけで内部表現の任意の数値があいまいな意味を持ちます。 –

関連する問題