2013-09-30 71 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

因子列不能輕鬆堆疊,因爲它們不共享一個levels屬性,所以如果您只是堆疊原始整數,則內部表示中的任何給定數字都有含糊不清的含義。 –