R语言 使用条件列值对ID行上的数据进行子集化,并在必要时创建一个NA行

6rqinv9w  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(102)

我的数据包括四个基本要素:ID、时间、暴露、结局
我想绘制我的暴露和结果之间的散点图,但我的暴露的关注时间点与结果的关注时间点不同,因此有些ID在该结果时间点没有任何评估。我想做的是创建一个数据子集,每个ID作为一行。那么在时间-1的暴露和在时间-3的结果,但是如果ID不存在,这里是一个数据的例子:

ID <- c(1,1,2,2,2,3,3,3,4,4)
exposure <-c(1.2, 1.3, 1.4, 1.5, 2.1, 2.2, 3.2, 4.2, 5.2, 6.2)
outcome <-c(0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 2.1, 3.1)
Time<-c("time_1","time_2","time_1","time_2","time_3","time_1","time_2","time_3","time_1","tme_2")
data <-data.frame(ID,exposure,outcome,Time)

我这样做的原因是因为散点图是一个横截面图,因此如果我只是根据每个ID的时间绘图,图将是空的,因为每行中没有暴露在时间1和结果在时间3的配对,这就是为什么我需要创建数据子集并自己制作配对。
我试过这些代码:

# so you see the empty cells and the reason of getting an empty plot
df <- data |> pivot_wider (name_from = Time, values_from = c(exposure,outcome))

#subsetting the data to only my desired time points (this helps me to see in my actual # data which IDs are actually not having an assessed time point

df1 <- data %>%
group_by(ID)%>%
filter(data, Time=="time_1" | Time=="time_3")%>%
ungroup()

# And eventually subsetting the data based on different timepoint to then merge them #together

df2 <- filter (data, Time=="time_1")
df3 <- filter (data, Time=="time_3")

但是在最后一个代码中,你可以看到两个数据集的大小是不同的,除此之外,我还需要指出,例如,ID=1,在time_3,结果为NA,所以我不想只对ID进行子集化,因为两个值都可用。
所以我最终想要的数据集,需要具有以下结构:

ID exposure_time_1  outcome_time_3
----------------------------------
1         1.2            NA
2         1.4            0.4
3         2.2            0.1
4         5.2            NA

有人对此有什么解决办法吗?

k5ifujac

k5ifujac1#

你就快成功了。你后面的列就行了。

df %>% 
    select(ID, exposure_time_1,  outcome_time_3) %>% 
    filter(!is.na(exposure_time_1) | !is.na(outcome_time_3))

您的数据集在这里不需要它,但是我添加了filter以确保最后两列中至少有一列是非空的。

相关问题