以下数据是治疗前后一系列测试中的一小部分。现在我的数据是这样的:
Subject Var1 Var2 Var3 Var4
1 A-pre 25 27 23 0
2 A-post 25 26 25 120
3 B-pre 30 28 27 132
4 B-post 30 28 26 140
我需要像这样重塑它:
Subject Var1.pre Var1.post Var2.pre Var2.post Var3.pre Var3.post Var4.pre Var4.post
1 A 25 25 27 26 23 25 0 120
2 B 30 30 28 28 27 26 132 140
我已经在SO中阅读了很多问题,并且在r像reshape2等数据争论的包中看到了文档,但我找不到类似的东西。有任何想法吗? 这是复制第一个表的代码:
dat<-structure(list(Subject = structure(c(2L, 1L, 4L, 3L), .Label = c("A-post",
"A-pre", "B-post", "B-pre"), class = "factor"), Var1 = c(25L,
25L, 30L, 30L), Var2 = c(27L, 26L, 28L, 28L), Var3 = c(23L, 25L,
27L, 26L), Var4 = c(0L, 120L, 132L, 140L)), .Names = c("Subject",
"Var1", "Var2", "Var3", "Var4"), row.names = c(NA, -4L), class = "data.frame")
答案 0 :(得分:3)
您可以使用dcast
的开发版本中的data.table
即可。使用tstrsplit
并将split
分割为' - '将“主题”列拆分为两个后,将v1.9.5。我们使用dcast
从'long'重构为'wide'格式。来自dcast
的{{1}}函数可以使用多个data.table
列,即'Var1'到'Var4'。
value.var
注意:安装devel版本的说明是here
使用library(data.table)#v1.9.5+
#convert the data.frame to data.table with `setDT(dat)`
#split the 'Subject' column with tstrsplit and create two columns
setDT(dat)[, c('Subject', 'New') :=tstrsplit(Subject, '-')]
#change the New column class to 'factor' and specify the levels in order
#so that while using dcast we get the 'pre' column before 'post'
dat[, New:= factor(New, levels=c('pre', 'post'))]
#reshape the dataset
dcast(dat, Subject~New, value.var=grep('^Var', names(dat), value=TRUE),sep=".")
# Subject Var1.pre Var1.post Var2.pre Var2.post Var3.pre Var3.post Var4.pre
#1: A 25 25 27 26 23 25 0
#2: B 30 30 28 28 27 26 132
# Var4.post
#1: 120
#2: 140
的选项是将{Subject'列分为两个dplyr/tidyr
,使用separate
将'wide'格式转换为'long'格式,{{1 'Var'列(即Var1到Var4)和'New'('VarNew')和gather
'long'格式为'wide'。
unite