2011-03-30 55 views

回答

4
df <- data.frame(var1=1:3,var2=4:6,var3=7:9) 
df2 <- stack(df) 
print(df2) 

    values ind 
1  1 var1 
2  2 var1 
3  3 var1 
4  4 var2 
5  5 var2 
6  6 var2 
7  7 var3 
8  8 var3 
9  9 var3 
+0

+1使用明显的功能。 – 2011-03-30 08:29:04

0

我猜你得到这个错误,因为数据框中的每个列/变量需要是相同的长度。您可以创建一个新的更长的变量并将其与旧的数据框结合,但它将重复其他变量中的数据。

> df <- data.frame(var1=1:3,var2=4:6,var3=7:9) 
> df 
    var1 var2 var3 
1 1 4 7 
2 2 5 8 
3 3 6 9 

# join combination of var1/var2 and 'df' dataframe 

> data.frame(newvar=c(df$var1,df$var2),df) 
    newvar var1 var2 var3 
1  1 1 4 7 
2  2 2 5 8 
3  3 3 6 9 
4  4 1 4 7 
5  5 2 5 8 
6  6 3 6 9 
+0

如果我这样做,我得到:错误data.frame( j_boa = c(data $ dv_job_8_1,data $ dv_job_8_2),df):参数意味着不同的行数:6,3 – user670186 2011-03-30 06:34:17

+0

@ user670186上面的例子工作,所以我认为你的代码可能有问题。也许c(data $ dv_job_8_1,data $ dv_job_8_2),df)需要是c(data $ dv_job_8_1,data $ dv_job_8_2),** data **),所以你引用了正确的原始数据帧。 – thelatemail 2011-03-30 07:38:31

1

你的输出有不同数量的行到你的输入,所以试图把后者变成前者会导致问题。只是做一个新的数据帧:

df <- data.frame(x = c(df$var1, df$var2, df$var3) 

您还可以得到花哨do.call,采取的事实,即一个数据帧是引擎盖下的列表:

df <- data.frame(x = do.call("c", df)) 
2

您可能想尝试unlist

dtf <- data.frame(a = 1:3, b = 1:3, c = 1:3) 
unlist(dtf) 
a1 a2 a3 b1 b2 b3 c1 c2 c3 
1 2 3 1 2 3 1 2 3 
0

堆栈似乎是明显的答案在这里,但重塑包装中的以等效方式工作,并可为其他更复杂的情况提供一些灵活性。假设你有一个名为对象工作逸:

library(reshape) 
melt(dat) 

    variable value 
1  var1  1 
2  var1  1 
3  var1  1 
4  var2  2 
5  var2  2 
6  var2  2 
7  var3  3 
8  var3  3 
9  var3  3 

如果您需要保留的一列作为ID变量:

> melt(dat, id.vars = "var1") 
    var1 variable value 
1 1  var2  2 
2 1  var2  2 
3 1  var2  2 
4 1  var3  3 
5 1  var3  3 
6 1  var3  3