2017-02-25 56 views
0

我真的很感謝一些幫助將這些混亂的新調查數據集變成可用的形式。它是以一種奇怪的方式收集的,現在我得到了奇怪的數據來處理。我已經瀏覽了tidyr,並用這些方法來解決問題。我懷疑我的問題是我在想這個數據集都是錯的,我對某個真正的答案一無所知。但考慮到我需要爲這個df做的所有事情,我不知道從哪裏開始,從而開始使用Google搜索。將數據集從寬變長,同時保留組ID,並且還收集列

我需要什麼: 對於每個人是自己排 每個人都保持自己的羣ID和治療價值 對於當前連接到每個人單獨成爲列(年齡,體重,身高)

變量假(更小):

structure(list(GroupID = 1:5, Treated = c("Y", "Y", "N", "Y", 
"N"), person1_age = c(45L, 33L, 71L, 19L, 52L), person1_weight = c(187L, 
145L, 136L, 201L, 168L), person1_height = c(69L, 64L, 51L, 70L, 
66L), person2_age = c(54L, 20L, 48L, 63L, 26L), person2_weight = c(140L, 
122L, 186L, 160L, 232L), person2_height = c(62L, 70L, 65L, 72L, 
74L), person3_age = c(21L, 56L, 40L, 59L, 67L), person3_weight = c(112L, 
143L, 187L, 194L, 159L), person3_height = c(61L, 69L, 73L, 63L, 
72L)), .Names = c("GroupID", "Treated", "person1_age", "person1_weight", 
"person1_height", "person2_age", "person2_weight", "person2_height", 
"person3_age", "person3_weight", "person3_height"), row.names = c(NA, 
5L), class = "data.frame") 

任何幫助或進一步的讀數,你可以指向我將非常感激。

回答

1

reshape能做到這一點,使用適當的參數:

> reshape(x, direction="long", varying=names(x)[3:11], timevar='person', v.names=c('height', 'age', 'weight'), sep='_') 
    GroupID Treated person height age weight id 
1.1  1  Y  1 187 45  69 1 
2.1  2  Y  1 145 33  64 2 
3.1  3  N  1 136 71  51 3 
4.1  4  Y  1 201 19  70 4 
5.1  5  N  1 168 52  66 5 
1.2  1  Y  2 140 54  62 1 
2.2  2  Y  2 122 20  70 2 
3.2  3  N  2 186 48  65 3 
4.2  4  Y  2 160 63  72 4 
5.2  5  N  2 232 26  74 5 
1.3  1  Y  3 112 21  61 1 
2.3  2  Y  3 143 56  69 2 
3.3  3  N  3 187 40  73 3 
4.3  4  Y  3 194 59  63 4 
5.3  5  N  3 159 67  72 5 

這依賴列在原始數據的順序,爲varying說法,在原始數據遞增的順序之中。

如果不是這種情況,請手動指定varying。下面是使用上面:

> names(x)[3:11] 
[1] "person1_age" "person1_weight" "person1_height" "person2_age" "person2_weight" "person2_height" 
[7] "person3_age" "person3_weight" "person3_height" 
0

我們也可以使用meltdata.table可以採取多種patternsmeasure參數

library(data.table) 
melt(setDT(x), measure = patterns("age$", "weight$", "height$"), 
    variable.name = "person", value.name = c("age", "weight", "height")) 
#  GroupID Treated person age weight height 
# 1:  1  Y  1 45 187  69 
# 2:  2  Y  1 33 145  64 
# 3:  3  N  1 71 136  51 
# 4:  4  Y  1 19 201  70 
# 5:  5  N  1 52 168  66 
# 6:  1  Y  2 54 140  62 
# 7:  2  Y  2 20 122  70 
# 8:  3  N  2 48 186  65 
# 9:  4  Y  2 63 160  72 
#10:  5  N  2 26 232  74 
#11:  1  Y  3 21 112  61 
#12:  2  Y  3 56 143  69 
#13:  3  N  3 40 187  73 
#14:  4  Y  3 59 194  63 
#15:  5  N  3 67 159  72 
相關問題