在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
答案 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