2013-09-30 50 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属性,所以如果您只是堆叠原始整数,则内部表示中的任何给定数字都有含糊不清的含义。 –