将列堆叠成R中的1列 [英] stacking columns into 1 column in R
本文介绍了将列堆叠成R中的1列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个数据框,如下所示:
ID Time U1 U2 U3 U4 ...
1 20 1 2 3 5 ..
2 20 2 5 9 4 ..
3 20 2 5 6 4 ..
.
.
And I would need to keep it like:
ID Time U
1 20 1
1 20 2
1 20 3
1 20 5
2 20 2
2 20 5
2 20 9
2 20 4
3 20 2
3 20 5
3 20 6
3 20 4
我尝试使用:
X <- read.table("mydata.txt", header=TRUE, sep=",")
X_D <- as.data.frame(X)
X_new <- stack(X_D, select = -c(ID, Time))
但我没有设法将数据转换为该表单。老实说,我几乎没有堆叠/转置的经验,所以任何帮助都是非常感谢的!
推荐答案
以下是stack
方法:
dat2a <- data.frame(dat[1:2], stack(dat[3:ncol(dat)]))
dat2a
# ID Time values ind
# 1 1 20 1 U1
# 2 2 20 2 U1
# 3 3 20 2 U1
# 4 1 20 2 U2
# 5 2 20 5 U2
# 6 3 20 5 U2
# 7 1 20 3 U3
# 8 2 20 9 U3
# 9 3 20 6 U3
# 10 1 20 5 U4
# 11 2 20 4 U4
# 12 3 20 4 U4
这与"reshape2"中的melt
非常相似:
library(reshape2)
dat2b <- melt(dat, id.vars=1:2)
dat2b
# ID Time variable value
# 1 1 20 U1 1
# 2 2 20 U1 2
# 3 3 20 U1 2
# 4 1 20 U2 2
# 5 2 20 U2 5
# 6 3 20 U2 5
# 7 1 20 U3 3
# 8 2 20 U3 9
# 9 3 20 U3 6
# 10 1 20 U4 5
# 11 2 20 U4 4
# 12 3 20 U4 4
而且,与@TylerRinker的答案非常类似,但没有去掉"Times",就是使用sep = ""
来帮助R猜测时间和变量名。
dat3 <- reshape(dat, direction = "long", idvar=1:2,
varying=3:ncol(dat), sep = "", timevar="Measure")
dat3
# ID Time Measure U
# 1.20.1 1 20 1 1
# 2.20.1 2 20 1 2
# 3.20.1 3 20 1 2
# 1.20.2 1 20 2 2
# 2.20.2 2 20 2 5
# 3.20.2 3 20 2 5
# 1.20.3 1 20 3 3
# 2.20.3 2 20 3 9
# 3.20.3 3 20 3 6
# 1.20.4 1 20 4 5
# 2.20.4 2 20 4 4
# 3.20.4 3 20 4 4
在所有这三个列中,您最终得到四列,而不是您在所需输出中描述的三列。然而,正如@ndoogan指出的那样,这样做是在丢失有关您的数据的信息。如果您不介意,您总是可以非常容易地从结果data.frame
中删除该列(例如,dat2a <- dat2a[-4]
。
这篇关于将列堆叠成R中的1列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文