按照我之前的问题: 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 =伴侣的性别......等等。
答案 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"))