整理和重塑凌乱的数据集(重塑/收集/联合功能)?

时间:2017-08-30 13:47:12

标签: r tidyr

按照我之前的问题: R: reshape/gather function to create dataset ready for multilevel analysis

我发现它有点复杂。我的数据集实际上比我希望的更“混乱”。所以这是完整的故事: 我有一个大数据集,240个案例。每排都是一例(乳腺癌患者)。在数据集末尾的某处(比如从第417栏开始),我有患者的伴侣数据,也填写了问卷。 最初,患者和伴侣都有人口统计学变量,其次是患者的测试结果,其次是伴侣数据。

我想创建一个数据集,在那里我“分割”患者和伴侣数据,但保持耦合。因此:我想复制主题ID并创建1s和2s的新列(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

请注意,我自己并没有创建这个数据集 - 我只是在这里整理混乱:)

编辑:数据集是荷兰语。 Pgesl =患者的性别,prgesl =伴侣的性别......等等。

1 个答案:

答案 0 :(得分:2)

使用data.table-package中的melt函数,您可以按模式使用多个度量,从而创建多个值列:

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

您也可以使用列索引或列名列表而不是模式。

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"))