如何在R中按标识符选取各列最高值(含NA)
解决方案
首先修正你的可复现代码——原代码生成的数据框会把列名当成第一行数据,且所有列都是字符类型,正确的创建方式如下:
aa <- data.frame( ID = c("A", "A", "B", "B"), bin1 = c(1, 0, 0, 0), bin2 = c(0, NA, 0, 1), bin3 = c(0, 1, 0, 0), stringsAsFactors = FALSE )
方法一:使用dplyr包(推荐,语法清晰)
加载dplyr包后,按ID分组,对每个二进制变量取最大值(你的规则NA<0<1正好匹配max的逻辑,max会自动忽略NA):
library(dplyr) # 基础版本 result <- aa %>% group_by(ID) %>% summarise(across(starts_with("bin"), ~max(., na.rm = TRUE))) # 处理某变量全为NA的情况(避免返回Inf) result <- aa %>% group_by(ID) %>% summarise(across(starts_with("bin"), ~if(all(is.na(.))) NA else max(., na.rm = TRUE)))
方法二:使用Base R的aggregate函数
无需额外安装包,直接用base R实现:
# 基础版本 result <- aggregate(. ~ ID, data = aa, FUN = function(x) max(x, na.rm = TRUE)) # 处理全NA的情况 result <- aggregate(. ~ ID, data = aa, FUN = function(x) { if(all(is.na(x))) NA else max(x, na.rm = TRUE) })
运行后得到的结果与你期望一致:
| ID | bin1 | bin2 | bin3 |
|---|---|---|---|
| A | 1 | 0 | 1 |
| B | 0 | 1 | 0 |
内容的提问来源于stack exchange,提问作者DW1310
相关产品推荐
相关产品推荐

