gpt4 book ai didi

R,dplyr : Collapse character variable elements by group if there is only one unique non-NA element per group

转载 作者:行者123 更新时间:2023-12-04 16:31:32 25 4
gpt4 key购买 nike

假设我有以下患者家乡的 data.frame df 和一个任意的临床指标,心率:

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

As I've learned here , summarise_each 可以将一个或多个函数应用于分组数据框,以将记录折叠为每组一个。最简单的情况可能是从 df 中的所有变量中选择第一个非 NA 值,并将它们折叠成每组一个。

  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 的变量进行分组,例如,选择每个 idmax 心率并折叠到一条记录,但我不知道该怎么做是有条件地将字符变量折叠为每组一条记录,因为只有一个唯一的非 NA 值

更具体地说,考虑 id 编号为 4 的患者。他们有两个唯一的 pt_hometown 值,“San Francisco”和“Seattle”。显然两者都不可能是正确的。因此,我想折叠每个只有一个非 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])

最佳答案

对于某些边缘情况,我不太清楚您想要什么,但这适用于 OP:

library(data.table)
dt = as.data.table(df) # or convert in place using setDT

unique(dt, by = c('id', 'pt_hometown'))[, lapply(.SD, na.omit), by = id]
# id pt_hometown pt_heartrate
#1: 1 Atlanta 82
#2: 2 San Diego NA
#3: 3 NA 76
#4: 4 San Francisco 90
#5: 4 Seattle 93

关于R,dplyr : Collapse character variable elements by group if there is only one unique non-NA element per group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com