在r中将一行转换为多行

Swa*_*nny 4 transpose r multiple-columns

在R中,我有数据,其中每个人有多个会话日期,以及一些测试的分数,但这是全部在一行.我想改变它,所以我有多行人员信息,但只有一个会话日期和相应的测试分数,并为每个人这样做.此外,每个人可能已完成不同数量的会话.

例如:

ID  Name  Session1Date  Score  Score  Session2Date  Score  Score
23  sjfd  20150904      2      3      20150908      5      7
28  addf  20150905      3      4      20150910      6      8
Run Code Online (Sandbox Code Playgroud)

至:

ID  Name  SessionDate  Score  Score
23  sjfd  20150904     2      3     
23  sjfd  20150908     5      7
28  addf  20150905     3      4
28  addf  20150910     6      8
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

您可以使用meltdevel版本的data.tableie.v1.9.5.它可以将多个"度量"列作为列表.安装说明是here

library(data.table)#v1.9.5+
melt(setDT(df1), measure = patterns("Date$", "Score(\\.2)*$", "Score\\.[13]"))
#   ID Name variable   value1 value2 value3
#1: 23 sjfd        1 20150904      2      3
#2: 28 addf        1 20150905      3      4
#3: 23 sjfd        2 20150908      5      7
#4: 28 addf        2 20150910      6      8
Run Code Online (Sandbox Code Playgroud)

或者用reshapebase R,我们可以指定direction为"长"和varyinglist列索引

 res <- reshape(df1, idvar=c('ID', 'Name'), varying=list(c(3,6), c(4,7), 
         c(5,8)), direction='long')
 res  
 #            ID Name time Session1Date Score Score.1
 #23.sjfd.1 23 sjfd    1     20150904     2       3
 #28.addf.1 28 addf    1     20150905     3       4
 #23.sjfd.2 23 sjfd    2     20150908     5       7
 #28.addf.2 28 addf    2     20150910     6       8
Run Code Online (Sandbox Code Playgroud)

如果需要,rownames可以更改

 row.names(res) <- NULL 
Run Code Online (Sandbox Code Playgroud)

更新

如果列遵循第6,第4与第7,第5,第8编组一个特定的顺序,即第三,我们可以创建一个matrix列索引,然后split获得listvarying在争论reshape.

 m1 <- matrix(3:8,ncol=2)
 lst <- split(m1, row(m1))
 reshape(df1, idvar=c('ID', 'Name'), varying=lst, direction='long')
Run Code Online (Sandbox Code Playgroud)