2017-10-06 56 views
0

我有一个广泛格式的数据框,它具有干预前和干预后问卷分数。有848名患者至少有一份问卷。我想看看这些数据来比较分数从干预前到干预后的变化。但是,由于这些数据的格式很广泛,数据在每个患者的问卷数量方面并不统一,所以我很挣扎。有一个变量列出了调查问卷的实例,问卷的价值是另一个变量。R中的宽格式变量结合

这里是它目前的样子的例子:

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名患者之间的情况不一致,我正在挣扎。

感谢您的帮助。

+0

如果你看看你的例子,我假设列名将是第一行而不是'X1','X2'等。 – akrun

+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 
+0

Jeppe,这个工作在t他抽样数据。然而,当我将它应用到我的数据时,它只会得到一些实例的总和,所以当我去计算平均值时,它只返回例如“NA”和“postop2”的方式。这可能是融入长格式的问题吗?任何建议从哪里开始寻找将不胜感激。谢谢。 –

+0

可能是因为您的数据集中有NA。试试DT2 < - na.omit(DT2) –

+0

我试过了,但是它省略了整个数据帧/数据表。 –