r - `summarise` 基于 `group_by` 具有多列,其中一列也有 `NA`

标签 r dplyr na

示例:

df <- data.frame(ID1 = c(1,2,3,4,5), ID2 = c(11, NA, 13, NA, 14), ID3 = c(1,2,3,4,5), value = c(110, 120, 130, 140, 150))
test <- test %>%
  group_by(ID1, ID2, ID3) %>%
  summarise(value=sum(value))

所需输出测试 df:

ID1 ID2 ID3 value
1   11  1   110
2   NA  2   120
3   13  3   130
4   NA  4   140
5   14  5   150

但是我在数据中得到以下输出:

ID1 ID2 ID3 value
1   11  1   110
3   13  3   130
5   14  5   150

注意:在上面的示例代码中,结果是所需的输出。但在我自己的代码中,本质上是相同的,但有 9 个组 ID,输出排除了 1 个 ID 列具有 NA 值的行。

我不明白为什么会发生这种情况,我使用了 groupby 并在类似的上下文中进行总结,其中带有 NA 的行没有被排除。

作为一种廉价的解决方案;我已经解决了这个问题,首先用字符值“NA”填充 NA 值,这些值在 summarise() 替换回真实的 NA 值之后。但这个解决方案让我很困扰,有人可以帮助我吗? 解决方案的示例代码:

df <- data.frame(ID1 = c(1,2,3,4,5), ID2 = c(11, NA, 13, NA, 14), ID3 = c(1,2,3,4,5), value = c(110, 120, 130, 140, 150))
test <- test %>%
  mutate(ID2 = ifelse(is.na(ID2), "NA", ID2)) %>%
  group_by(ID1, ID2, ID3) %>%
  summarise(value=sum(value)) %>% 
  mutate(ID2 = ifelse(ID2 == "NA", NA, ID2))

最佳答案

R/其大部分函数的默认行为是忽略 NA,NA 被视为没有意义。但是,就您的情况而言,NA 似乎确实包含一些信息,您希望保持 NA 不变。

在这种情况下,我建议将 ID 列强制为字符,然后将 NA 存储为字符串“NA”。

as.character.na <- function(x){
  
  Output <- as.character(x)
  Output[is.na(Output)] <- "NA"
  return(Output)
  
}

test <- df %>%
  mutate(ID1 = as.character.na(ID1), ID2 = as.character.na(ID2),
         ID3 = as.character.na(ID3)) %>%
  group_by(ID1, ID2, ID3) %>%
  summarise(value=sum(value))

关于r - `summarise` 基于 `group_by` 具有多列,其中一列也有 `NA`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76048258/

相关文章:

r - 使用 r (data.table/dplyr) 中的列表列

R - 在 dplyr::mutate/if_else 组合中寻找更好的语法

r - 当使用相等 (==) 的因子对行进行子集化时,还包括 NA。 %in% 不会发生这种情况。正常吗?

r - 如何在另一个变量中第 n 次出现某个值时更改变量?

r - 在 R 中抑制来自 zip 的消息

r - 使用 ggplot2 在 dplyr 链中设置子集/过滤器

仅使用 data.table 将 NA 替换为 data.table 中的最后一个非 NA

R 用前一行值填充 NA 和条件

R - 使用 ggplot2 在线图中绘制不同时间序列的滚动平均值

r - dbPool 对象过期