整理并重塑凌乱的数据集(reshape/gather/unite 函数)?
Tidy up and reshape messy dataset (reshape/gather/unite function)?
根据我之前的问题:
我发现它有点复杂。我的数据集实际上比我希望的 'messier'。所以这是完整的故事:
我有一个大数据集,240 个案例。每行都是一个案例(乳腺癌患者)。在数据集末尾的某个地方(比如从第 417 列开始),我有患者的伴侣数据,这些数据也填写了问卷。
一开始,有患者和伴侣的人口统计变量,然后是只有患者的测试结果,然后是伴侣数据。
我想创建一个数据集,其中我 'split' 患者和合作伙伴数据,但保持耦合。因此:我想复制主题 ID 并创建包含 1 和 2 的新列(1 对应于患者,2 对应于合作伙伴)。
然后,我想要我的数据实际上是现在的样子,但是有些变量可以匹配(例如,我知道患者 [pgebdat] 和合作伙伴 [prgebdat] 有 "date of birth" 分开。当然,我可以把这个进入 '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
但现在它还会将患者的出生日期复制并粘贴到 'partner' 行。
我被卡住了,甚至不太清楚你需要什么数据才能回答我的问题,所以请尽管问。我将在下面提供一些示例:
数据示例
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 = 伴侣的性别...等等
使用 data.table 包中的 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"))
根据我之前的问题:
我发现它有点复杂。我的数据集实际上比我希望的 'messier'。所以这是完整的故事: 我有一个大数据集,240 个案例。每行都是一个案例(乳腺癌患者)。在数据集末尾的某个地方(比如从第 417 列开始),我有患者的伴侣数据,这些数据也填写了问卷。 一开始,有患者和伴侣的人口统计变量,然后是只有患者的测试结果,然后是伴侣数据。
我想创建一个数据集,其中我 'split' 患者和合作伙伴数据,但保持耦合。因此:我想复制主题 ID 并创建包含 1 和 2 的新列(1 对应于患者,2 对应于合作伙伴)。 然后,我想要我的数据实际上是现在的样子,但是有些变量可以匹配(例如,我知道患者 [pgebdat] 和合作伙伴 [prgebdat] 有 "date of birth" 分开。当然,我可以把这个进入 '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
但现在它还会将患者的出生日期复制并粘贴到 'partner' 行。
我被卡住了,甚至不太清楚你需要什么数据才能回答我的问题,所以请尽管问。我将在下面提供一些示例:
数据示例
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 = 伴侣的性别...等等
使用 data.table 包中的 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"))