2017-10-06 55 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

我試過了,但是它省略了整個數據幀/數據表。 –