示例:
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/