在数据之前和之后重塑

时间:2015-08-01 21:35:39

标签: r

以下数据是治疗前后一系列测试中的一小部分。现在我的数据是这样的:

  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")

1 个答案:

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