在r中将一行变成多行

Turning one row into multiple rows in r

在 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

您可以使用 data.table 的开发版本中的 melt 即。 v1.9.5。它可以将多个 'measure' 列作为一个列表。安装说明是 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

或使用 base R 中的 reshape,我们可以将 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 对于 reshape 中的 varying 参数。

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

如果你的数据框名称是data

使用这个

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

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