本次讲解数据的基础操作之长宽数据转换
library(ggplot2)
library(gbmt)
library(JM)
library(dplyr)
library(tidyverse)
data(pbc2)
colnames(pbc2)
我们加载了pbc的数据,这是肝炎的数据,数据如下图:
可以看到这是典型的纵向数据。
如果我们想看群体胆红素随随访时间的变化轨迹,可利用下面代码:
ggplot(pbc2, aes(x = year, y = serBilir, group = id)) +
geom_line() +
labs(title = "traj", x = "Year", y = "BiliL") +
theme_minimal()
下面我们主要关注胆红素,所以尝试以胆红素为核心进行数据的长宽转换
pbc3 <- select(pbc2,'id','year','serBilir')
pbc_with_counts <- pbc3 %>%
group_by(id) %>%
mutate(visit_number = row_number()) %>%
ungroup()
我们得到pbc_counts表格,可以看到我们生成了visit_number这一列,其中每个数值代表了每个病人随访第几次。我们为什么要这么做?很简单,pbc数据没有具体的固定的的随访间隔,我们只能按照随访次数。
下面进行长宽数据转换时,我们需要去除year列,这一列数据没有规律,几乎没有重复值,不删除的话,无法合并。最后一行代码,把第一列之后的17列数据的列名统一加上‘visit’
pbc_with_counts <- pbc_with_counts[,-2]
pbc_wider <- pbc_with_counts %>%
pivot_wider(names_from =visit_number,
values_from = serBilir)
colnames(pbc_wider)[-1] <- paste("visit", 1:16, sep = "")
目前为止,我们把胆红素(Y/因变量)转换为宽数据了。现在为了适合trajeR包,我们还需要将时间time转换为宽数据,但问题是,没有固定的随访间隔,怎么办呢?只能采用随访次数。
pbc_with_counts$foll <- pbc_with_counts$visit_number
library(reshape2)
pbc_wider2 <- dcast(pbc_with_counts, id ~ visit_number, value.var = "foll")
colnames(pbc_wider2)[-1] <- paste("time", 1:16, sep = "")
然后表格合并
pbc_wider3 <- merge(pbc_wider,pbc_wider2,by='id')