如何使用纵向数据集中的年龄变量生成记录进入研究的变量?

时间:2019-06-12 15:21:51

标签: r if-statement

我基本上有一个纵向数据集,其中包括8个数据收集波。因此,我有8个年龄变量age_1:age_8,如果参与者在第一波进入,则他们的年龄记录在age_1中,否则将其设置为NA。同样,如果参与者已在第2浪中进入研究,则他们的年龄会记录在age_2中,并且还会记录进入前一浪(第1浪)的参与者的随访年龄,但如果参与者进入在随后的波浪(不是波浪1或2)中,其年龄列为NA。因此,我希望这能阐明数据的组成部分。我想做的是创建一个变量,该变量仅记录个人进入研究的年龄。

我尝试做的是这样的事情(我知道它很糟糕),这只是entry_2中要声明的语句,如果age_2(第2波)是NA并且{{ 1}}不是NA,则将条目记录为NA,否则将第二波的年龄记录值作为条目。因此,我试图仅考虑参加该特定浪潮的人员的年龄,并从可能已经记录的先前浪潮中排除任何后续年龄。但这不起作用,因为它仅复制了年龄变量,如下例所示。

age_1

3 个答案:

答案 0 :(得分:0)

我认为这应该可以为您提供所需的东西:


first_entry <- function(subj) {
    na.omit(subj)[1]
}

age_df <- data.frame(
    age_1 = c(NA, NA, 1, NA),
    age_2 = c(1, NA, 3, NA),
    age_3 = c(2, NA, 4, 4),
    age_4 = c(3, 4, 5, 5)
)

  age_1 age_2 age_3 age_4
1    NA     1     2     3
2    NA    NA    NA     4
3     1     3     4     5
4    NA    NA     4     5

youngest <- apply(age_df, 1, first_entry)

youngest
[1] 1 4 1 4

答案 1 :(得分:0)

最后一段对于您要寻找的内容有些困惑,但是使用dplyrtidyr来完成此操作可能会更好。

library(dplyr)
library(tidyr)
#' Example data
test = data.frame(participant = c("a", "b", "c", "d"), age_1 = c(NA, 10, NA, NA), age_2 = c(14, 11, NA, NA), age_3 = c(NA, 12, NA, 16), age_4 = c(NA, 14, 10, 17), age_5 = c(NA, NA, NA, NA))
test2 <- test %>% gather(key = "wave", value = "age", -participant) %>% group_by(participant) %>% mutate(previous_age = lag(age)) %>% ungroup() %>% mutate(is_entry = ifelse(is.na(previous_age) & !is.na(age), 1, 0)) %>% select(-previous_age)

这将为您提供4列:参与者,它是哪个波浪,该波浪的年龄,以及该波浪是否是该参与者的条目。在这里,您可以进行分析,并按wave和is_entry进行分组以获得摘要。

答案 2 :(得分:0)

以长数据格式显示的年龄解决方案。

id wave age
 1    1   3
 1    2   6
 1    3   9
 1    4  10
 2    1  NA
 2    2  NA
 2    3   5
 2    4   9

tapply(df$age, df$id, min, na.rm=F)

获得

[1] 3 5