var1 var2 var3
1 2 3
1 2 3
1 2 3
我想在var1下面堆叠var2和var3来获取:
var1
1
1
1
2
2
2
3
3
3
我试过了:
data$var <- append(data$var1,data$var2)
然后我得到一个错误,我的替换有更多行。我该如何解决这个问题?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:1)
您的输出与输入的行数不同,因此尝试将后者转换为前者会导致问题。只需创建一个新的数据框:
df <- data.frame(x = c(df$var1, df$var2, df$var3)
你也可以使用do.call
,并利用数据框是一个列表的事实:
df <- data.frame(x = do.call("c", df))
答案 3 :(得分: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
答案 4 :(得分:0)
Stack似乎是明显的答案,但重塑包中的melt
确实以同等的方式工作,并且可以为其他更复杂的情况提供一些灵活性。假设您正在使用名为dat的对象:
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