2017-08-30 83 views
1

以下我先前的問題: R: reshape/gather function to create dataset ready for multilevel analysis整理和重塑凌亂的數據集(重塑/收集/統一功能)?

我發現它有點複雜。我的數據集實際上比我希望的更「混亂」。所以這裏是全文: 我有一個很大的數據集,240個案例。每一行都是一例(乳腺癌患者)。在數據集末尾的某處(從第417列開始),我有患者的合作伙伴數據,這些數據也填寫了問卷。首先,患者和合作夥伴都有人口統計變量,其次是患者的測試結果,然後是合作伙伴數據。

我想創建一個數據集,在這裏我將患者和合作夥伴數據「分開」,但保持耦合。因此:我想複製主題ID並用1和2創建新列(1對應於患者,2對應於夥伴)。 然後,我希望我的數據像現在一樣,但是可以匹配一些變量(例如,我知道患者[pgebdat]和伴侶[prgebdat]有單獨的「出生日期」。這與以下兩個相互出生日期「gebdat」

此代碼爲我工作我的數據的一小部分。

mydf_long <- mydf4 %>% 
unite(bb1:bb50rec, col = `1`, sep = ";") %>% # Combine responses of 'p1' through 'p3' 
unite(pbb1:pbb50recM, col = `2`, sep = ";") %>% # Combine responses of 'pr1' through 'pr3' 
gather(couple, value, `1`:`2`) %>% # Form into long data 
separate(value, sep = ";", into = c(paste0("bb", seq(1:104),"", sep = ','))) %>% # Separate and retrieve original answers 
arrange(id) 

結果:

id groep_MNC zkhs fbeh pgebdat couple bb1, 
1 3   1 1 1 1955-12-01  1 4 
2 3   1 1 1 1955-12-01  2 5 
3 5   1 1 1 1943-04-09  1 2 
4 5   1 1 1 1943-04-09  2 2 

但現在它會將患者的出生日期複製並粘貼到「合作伙伴」 '排。

我被卡住了,甚至不知道你需要什麼數據才能回答我的問題,所以請不要問。我會在下面的例子中的東西:

數據

 id groep_MNC zkhs fbeh pgebdat p_age pgesl prgebdat pr_age prgesl relpnst 
1  3   1 1 1 1955-12-01 42.50000  1  <NA>  NA  2  1 
2  5   1 1 1 1943-04-09 55.16667  1 1962-04-18 36.50000  1  2 
3  7   1 1 1 1958-04-10 40.25000  1  <NA>  NA  2  1 
4 10   1 1 1 1958-04-17 40.25000  1 1957-07-31 41.33333  2  1 
5 12   1 1 2 1947-11-01 50.66667  1 1944-06-08 54.58333  2  1 

和實例的話,幾百個變量的只有患者後,該合作伙伴的數據走來:

 pbb1 pbb2 pbb3 pbb4 pbb5 pbb6 pbb7 pbb8 pbb9 
1  5 5 5 5 2 5 4 2 3 
2  2 1 4 1 3 4 3 3 4 
3  5 3 4 4 4 3 5 3 4 
4  5 3 5 5 5 5 4 4 4 
5  5 5 5 5 5 4 4 3 4 

請注意,我自己並沒有創建這個數據集 - 我只是在這裏清理混亂:)

編輯:該數據集位於荷蘭。病人,prgesl =性別的合作伙伴...等

+0

好像你可能會試圖把一切都在一個表中的過於複雜的任務。它是否簡化了將合作伙伴數據與患者數據分開的任務,分別對每個患者進行必要的操作,然後將分析前需要的數據合併起來? – Benjamin

+0

這可能是一個好主意,但我不完全確定如何添加額外的行並保持數據耦合。 – HannekeLettinga

回答

2

從data.table包使用melt功能,您可以通過圖案使用多種措施,因此建立一個以上的值列Pgesl =性別:

library(data.table) 
melt(setDT(df), measure.vars = patterns('_age','gesl','gebdat'), 
    value.name = c('age','geslacht','geboortedatum') 
    )[, variable := c('patient','partner')[variable]][] 

你:

id groep_MNC zkhs fbeh relpnst pbb1 pbb2 variable  age geslacht geboortedatum 
1: 3   1 1 1  1 5 5 patient 42.50000  1 1955-12-01 
2: 5   1 1 1  2 2 1 patient 55.16667  1 1943-04-09 
3: 7   1 1 1  1 5 3 patient 40.25000  1 1958-04-10 
4: 10   1 1 1  1 5 3 patient 40.25000  1 1958-04-17 
5: 12   1 1 2  1 5 5 patient 50.66667  1 1947-11-01 
6: 3   1 1 1  1 5 5 partner  NA  2   <NA> 
7: 5   1 1 1  2 2 1 partner 36.50000  1 1962-04-18 
8: 7   1 1 1  1 5 3 partner  NA  2   <NA> 
9: 10   1 1 1  1 5 3 partner 41.33333  2 1957-07-31 
10: 12   1 1 2  1 5 5 partner 54.58333  2 1944-06-08 

相反的模式,你也可以使用列索引或COLUMNNAMES的列表。

HTH


使用的數據:

df <- structure(list(id = c(3L, 5L, 7L, 10L, 12L), 
        groep_MNC = c(1L, 1L, 1L, 1L, 1L), 
        zkhs = c(1L, 1L, 1L, 1L, 1L), 
        fbeh = c(1L, 1L, 1L, 1L, 2L), 
        pgebdat = c("1955-12-01", "1943-04-09", "1958-04-10", "1958-04-17", "1947-11-01"), 
        p_age = c(42.5, 55.16667, 40.25, 40.25, 50.66667), 
        pgesl = c(1L, 1L, 1L, 1L, 1L), 
        prgebdat = c("<NA>", "1962-04-18", "<NA>", "1957-07-31", "1944-06-08"), 
        pr_age = c(NA, 36.5, NA, 41.33333, 54.58333), 
        prgesl = c(2L, 1L, 2L, 2L, 2L), 
        relpnst = c(1L, 2L, 1L, 1L, 1L), 
        pbb1 = c(5L, 2L, 5L, 5L, 5L), 
        pbb2 = c(5L, 1L, 3L, 3L, 5L)), 
       .Names = c("id", "groep_MNC", "zkhs", "fbeh", "pgebdat", "p_age", "pgesl", "prgebdat", "pr_age", "prgesl", "relpnst", "pbb1", "pbb2"), 
       class = "data.frame", row.names = c("1", "2", "3", "4", "5"))