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)
您可以使用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)
或者用reshape从base R,我们可以指定direction为"长"和varying为list列索引
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获得list了varying在争论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)