在R

时间:2017-10-06 04:32:06

标签: r dataframe

我目前的数据框格式较宽,有干预前和干预后的问卷评分。有848名患者至少有一份问卷。我想看一下数据来比较分数从干预前和干预后的变化情况。但是,由于数据格式宽,而且每位患者的问卷数量不一致,因此我很挣扎。有一个变量列出问卷的实例,问卷的价值是另一个变量。

以下是目前的示例:

a=c('instance1','total1','instance2', 'total2', 'instance3', 'total3', 
'instance4','total4', 'instance5','total5')
b=c('postop2', '5', 'postop1', '7', NA, NA, 'preop', '10', NA, NA)
c=c(NA, NA, 'preop', '3', NA, NA, 'postop1', '4', 'postop2', '3')
data.frame(rbind(a,b,c))

有848行问卷数据。

我需要计算从preop到postop问卷的差异。重新组织这些数据的最佳方法是什么,以便我可以获得这些值?我很挣扎,因为所有848名患者之间并没有排队。

谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

不确定这是否是你所追求的,但尝试这种data.table方法:

library(data.table)

DT <- data.table(rbind(b,c))
names(DT) <- a

DT2 <- melt(DT, measure = patterns("^instance", "^total"), value.name = c("instance", "total"))

DT2

    variable instance total
 1:        1  postop2     5
 2:        1       NA    NA
 3:        2  postop1     7
 4:        2    preop     3
 5:        3       NA    NA
 6:        3       NA    NA
 7:        4    preop    10
 8:        4  postop1     4
 9:        5       NA    NA
10:        5  postop2     3

编辑:

如果您想要摘要,您也可以这样做:

DT2$total <- as.numeric(DT2$total)  # for some reason total is class character

DT2[, sum(total), by=instance]

   instance V1
1:  postop2  8
2:       NA NA
3:  postop1 11
4:    preop 13