我的数据框看起来像:
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))
但我还没有设法将数据转换为该表单。老实说,我几乎没有堆叠/移调的经验,所以非常感谢任何帮助!
答案 0 :(得分:8)
以下是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的答案非常相似,但不会删除“时间”,只是使用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]
。
答案 1 :(得分:2)
使用基座reshape
:
dat <- read.table(text="ID Time U1 U2 U3 U4
1 20 1 2 3 5
2 20 2 5 9 4
3 20 2 5 6 4", header=TRUE)
colnames(dat) <- gsub("([a-zA-Z]*)([0-9])", "\\1.\\2", colnames(dat))
reshape(dat, varying=3:ncol(dat), v.names="U", direction ="long", timevar = "Time",
idvar = "ID")
答案 2 :(得分:1)
您也可以使用melt():
library(reshape2)
new_data <- melt(old_data, id.vars=c("ID","Time"),
value.name = "U")
然后删除'变量'列:
new_data$variable <- NULL
答案 3 :(得分:0)
试试这个:
do.call(rbind, lapply(1:4, function(i)structure(dat[,c("ID", "Time", paste0("U",i))], names=c("ID", "Time", "U"))))
dat
是您的data.frame ...