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
答案 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)
最后一段对于您要寻找的内容有些困惑,但是使用dplyr
和tidyr
来完成此操作可能会更好。
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