【发布时间】:2021-12-11 00:19:24
【问题描述】:
问题 1) 假设我有 4 名参与者超过 4 年的纵向数据,即 0、1、3、4 年。 我的目标是
- 检查数据是否至少记录了任意 2 个时间点的结果变量 (n1)。
- 如果只存在一个记录,则删除;否则保留它。
- 对多个结果变量 (m1) 重复 1) 和 2)
我拥有的数据
ID visit n1 m1
1 0 5.6 0
1 1 1.5 NA
1 3 0.5 NA
1 4 NA NA
2 0 6 1
2 1 NA 0
2 3 NA 0
2 4 NA 0
3 0 3.4 0
3 1 2.4 0
3 3 2.5 0
3 4 1 1
4 0 NA NA
4 1 NA NA
4 3 NA NA
4 4 3.3 0
这就是我想要的
data 1
ID visit n1
1 0 5.6
1 1 1.5
1 3 0.5
1 4 NA
3 0 3.4
3 1 2.4
3 3 2.5
3 4 1
data2
ID visit m1
2 0 1
2 1 0
2 3 0
2 4 0
3 0 0
3 1 0
3 3 0
3 4 1
或者我们创建新变量 n12 的这种形式(n1 存在 0= =2 存在 n1 值)&类似地 m12。稍后我可以根据这些新变量 n12 和 m12 的值删除行。
ID visit n1 m1 n12 m12
1 0 5.6 0 1 0
1 1 1.5 NA 1 0
1 3 0.5 NA 1 0
1 4 NA NA 1 0
2 0 6 1 0 1
2 1 NA 0 0 1
2 3 NA 0 0 1
2 4 NA 0 0 1
3 0 3.4 0 1 1
3 1 2.4 0 1 1
3 3 2.5 0 1 1
3 4 1 1 1 1
4 0 NA NA 0 0
4 1 NA NA 0 0
4 3 NA NA 0 0
4 4 3.3 0 0 0
我试过Deleting incomplete cases across multiple rows in R studio 但是下面的代码在 mydata 中给了我 '0' 的观察结果,因为即使跨行发现单个 NA 也会删除行
mydata = mydata[!mydata$ID %in% mydata[!complete.cases(mydata) ,]$ID, ]
library(plyr)
# counts all the IDs
cnt = count(mydata, "ID")
# Eliminates any ID that doesn't have 2 observations
mydata[mydata$ID %in% cnt[cnt$freq == 2, ]$ID, ]
我也尝试了长到宽格式,这不起作用,因为我猜我的值是多个变量
library(dplyr)
mydata <- mydata %>%
tidyr::spread(key=time, value=value) %>% # reformat to wide
na.omit() %>% # delete cases with missingness on any variable (i.e. any time point)
tidyr::gather(key="time", value="value", -ID) # put it back in long format
新问题 2):如果我只想拥有 n1 的访问 =0 值的行以及 n1 的至少一次其他访问 (1/3/4) 记录,我应该如何编码?获取这样的数据:
ID visit n1
1 0 5.6
1 1 1.5
1 3 0.5
1 4 NA
3 0 3.4
3 1 2.4
3 3 2.5
3 4 1
请建议 R 语法或方法来实现目标 谢谢!
【问题讨论】:
标签: r longitudinal