假设我有以下 data.framedf
患者家乡和一项任意临床指标(心率):
id <- c(rep(1:3, each = 2), rep(4, 3))
pt_hometown <- c("Atlanta", NA,
NA, "San Diego",
NA, NA,
"San Francisco", "Seattle", NA)
pt_heartrate <- c(NA, 82,
NA, NA,
76, 76,
90, 93, NA)
df <- data.frame(id = id,
pt_hometown = pt_hometown,
pt_heartrate = pt_heartrate,
stringsAsFactors = FALSE)
df
这使
id pt_hometown pt_heartrate
1 Atlanta NA
1 <NA> 82
2 <NA> NA
2 San Diego NA
3 <NA> 76
3 <NA> 76
4 San Francisco 90
4 Seattle 93
4 <NA> NA
正如我在这里学到的 https://stackoverflow.com/questions/28509462/how-to-collapse-many-records-into-one-while-removing-na-values, summarise_each
可以将一个或多个函数应用于分组数据框,以将记录折叠为每组一个。最简单的情况可能是从所有变量中选择第一个非 NA 值df
并将它们折叠成每组一个。
df1 <- df %>%
group_by(id) %>%
summarise_each(funs(first(.[!is.na(.)]))
df1
id pt_hometown pt_heartrate
1 Atlanta 82
2 San Diego NA
3 NA 76
4 San Francisco 90
当然,对于实际应用,人们可能希望以更具体的方式折叠。我知道如何分组df
按类型划分的变量,例如,选择max
每心率id
并折叠成一条记录,但是我不知道该怎么做是有条件地将字符变量折叠为每组一个记录,因为只有一个唯一的非 NA 值.
更具体地说,考虑患者id
数字 4。它们有两个独特的值pt_hometown
、“旧金山”和“西雅图”。显然两者都不可能都是正确的。所以我想折叠只有一个非 NA 值的每个组的记录,但保留存在多个非 NA 元素的行然后引起我们小组的注意,以决定如何纠正原始数据集中的错误。
所以我想df1
看起来像这样:
id pt_hometown pt_heartrate
1 Atlanta 82
2 San Diego NA
3 <NA> 76
4 San Francisco 90
4 Seattle 93
这是我尝试过的:
df1 <- df %>%
group_by(id) %>%
summarise_each_(funs(first(.[!is.na(.)])), df[length(unique(.[!is.na(.)])) == 1])