2011-03-30 70 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