2013-04-09 90 views
4

1列我有一个看起来像一个数据帧:堆叠成列R中

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

这通常被称为从宽幅长格式转换然而,这样你定义它,你失去了哪些列一个数据是从哪里来的信息顺便说一下,包'reshape2。 '涵盖了这种转变。 – ndoogan 2013-04-09 19:54:41

+1

此外,如果您提供了一个非常简单的方法让回答者将示例数据导入到R中,您就更有可能得到您真正想要的答案。提供文件中的内容并不简单,但提供原始示例数据框对象IS的'dput()'输出! – ndoogan 2013-04-09 20:00:10

+1

还有一个解决方案'tidyr :: gather()' – Phil 2015-10-19 13:27:36

回答

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 ...

+0

谢谢!它给了我一个错误:'未定义的列'在这里''.data.frame'(dat,,[,c(“ID”,“Time”, – user2263330 2013-04-09 20:03:17

+0

Hi @ user2263330,它适用于'dat < data.frame(ID = 1:3,时间= 20,U1 = 1:3,U2 = 4:6,U3 = 7:9,U4 = 10:12)'你的data.frame的名称是什么? – 2013-04-09 20:08:34

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") 
+0

(+1)这可能是值得指定什么“基本重塑”意味着在另一个reshape答案取决于reshape2包的情况下。 – ndoogan 2013-04-09 20:10:37

+0

这应该为任何人想知道:'?reshape' – 2013-04-09 20:15:33

+0

+1为完全匹配输出,但我也担心这种方式丢失信息。 – A5C1D2H2I1M1N2O1R2T1 2013-04-10 05:41:51

6

这里的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]

0

您也可以使用熔体():

library(reshape2) 

new_data <- melt(old_data, id.vars=c("ID","Time"), 
    value.name = "U") 

然后取出“变量“列:

new_data$variable <- NULL 
+0

糟糕,这实际上会按old_data中的行排序U行 – Jala015 2017-06-18 20:18:55