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