在r中将一行转换为多行

时间:2015-06-17 16:09:54

标签: r multiple-columns transpose

在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

要:

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

2 个答案:

答案 0 :(得分:6)

您可以使用melt的开发版本中的data.table即可。 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

或者使用reshape中的base R,我们可以将direction指定为'long',将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

如果需要,可以更改rownames

 row.names(res) <- NULL 

更新

如果列遵循特定顺序,即第3个分组为第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')

答案 1 :(得分:0)

如果您的数据框名称为data

使用此

data1 <- data[1:5]
data2 <- data[c(1,2,6,7,8)]
newdata <- rbind(data1,data2)

这适用于您给出的示例。您可能必须在data1和data2中正确更改列名,以获得正确的rbind