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)
然后我得到一个错误,我的替换有更多行。我该如何解决这个问题?
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
您可能想尝试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
您的输出与输入的行数不同,因此尝试将后者转换为前者会导致问题。只需制作一个新的数据框:
df <- data.frame(x = c(df$var1, df$var2, df$var3)
您还可以使用do.call
,利用数据框是引擎盖下的列表这一事实:
df <- data.frame(x = do.call("c", df))
我猜您会收到此错误,因为数据框中的每一列/变量都必须具有相同的长度。您可以创建一个更长的新变量并将其与旧数据框连接,但它将重复其他变量中的数据。
> 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
Stack 在这里似乎是显而易见的答案,但melt
在 reshape 包中确实以等效的方式工作,并且可以为其他更复杂的情况提供一些灵活性。假设您正在使用一个名为 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