R 长到宽格式分类变量和日期
R long to wide format categorial variables and dates
我想制作一个长格式的数据集,其中包含一个具有宽格式开始和结束日期的分类变量(药物)。因此,每个 ID 应该有一行,对于每种药物,一列的条目 1/0 要么是患者得到了药物,要么没有。并且药物列应该有各自的开始和结束日期作为额外的列。
我想
test <- data.frame(
PatID = c(1L, 1L, 2L, 2L, 3L, 4L,4L),
medication = c("Jak","Others", "HU", "Inf","Others", "HU","Others"), startDate = c("2016-12-14", "2017-02-04", "2016-03-26", "2016-06-13", "2012-27-03", "2012-04-21", "2010-02-03"),
endDate = c("2018-11-14", "2018-02-25", "2017-06-13", "2017-11-12", "2018-27-03", "2016-04-30", "2016-08-16")
)
输出应该如下
ID Jak Jak_startDate Jak_endDate HU HU_startDate HU_endDate Inf Inf_startDate Inf_endDate Others Others_startDate Others_endDate <br/>
1 1 2016-12-14 2018-11-14 0 NA NA 0 NA NA 1 2017-02-04 2018-02-25
2 0 NA NA 1 2017-06-13 2017-11-12 1 2018-03-27 2016-04-30 0 NA NA
3 0 NA NA 0 NA NA 0 NA NA 1 2012-27-03 2018-27-03
4 0 NA NA 1 2012-04-21 2016-04-30 0 NA NA 1 2010-02-03 2016-08-16
使用 tidyverse
这是我所做的:
test %>%
gather(key, value, - PatID, -medication) %>%
arrange(PatID, value) %>%
mutate(new_key = paste(medication, key, sep = "_")) %>%
select(PatID, new_key, value) %>%
spread(new_key, value) %>%
left_join(test %>% select(PatID, medication) %>%
mutate(ind = 1) %>%
spread(medication, ind))
在这里,我把数据加长了,然后arrange
它根据PatID
和value
。然后我创建一个新的键列 new_key
和 select
只有三个变量:PatID
、new_key
和 value
。然后我把这些都变成宽数据,但是我们仍然需要Jak
、HU
等列,这些似乎是指示变量。为此,我在 left_join
中获取测试数据和 spread
以获取您请求的列。
我想制作一个长格式的数据集,其中包含一个具有宽格式开始和结束日期的分类变量(药物)。因此,每个 ID 应该有一行,对于每种药物,一列的条目 1/0 要么是患者得到了药物,要么没有。并且药物列应该有各自的开始和结束日期作为额外的列。
我想
test <- data.frame(
PatID = c(1L, 1L, 2L, 2L, 3L, 4L,4L),
medication = c("Jak","Others", "HU", "Inf","Others", "HU","Others"), startDate = c("2016-12-14", "2017-02-04", "2016-03-26", "2016-06-13", "2012-27-03", "2012-04-21", "2010-02-03"),
endDate = c("2018-11-14", "2018-02-25", "2017-06-13", "2017-11-12", "2018-27-03", "2016-04-30", "2016-08-16")
)
输出应该如下
ID Jak Jak_startDate Jak_endDate HU HU_startDate HU_endDate Inf Inf_startDate Inf_endDate Others Others_startDate Others_endDate <br/>
1 1 2016-12-14 2018-11-14 0 NA NA 0 NA NA 1 2017-02-04 2018-02-25
2 0 NA NA 1 2017-06-13 2017-11-12 1 2018-03-27 2016-04-30 0 NA NA
3 0 NA NA 0 NA NA 0 NA NA 1 2012-27-03 2018-27-03
4 0 NA NA 1 2012-04-21 2016-04-30 0 NA NA 1 2010-02-03 2016-08-16
使用 tidyverse
这是我所做的:
test %>%
gather(key, value, - PatID, -medication) %>%
arrange(PatID, value) %>%
mutate(new_key = paste(medication, key, sep = "_")) %>%
select(PatID, new_key, value) %>%
spread(new_key, value) %>%
left_join(test %>% select(PatID, medication) %>%
mutate(ind = 1) %>%
spread(medication, ind))
在这里,我把数据加长了,然后arrange
它根据PatID
和value
。然后我创建一个新的键列 new_key
和 select
只有三个变量:PatID
、new_key
和 value
。然后我把这些都变成宽数据,但是我们仍然需要Jak
、HU
等列,这些似乎是指示变量。为此,我在 left_join
中获取测试数据和 spread
以获取您请求的列。