You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

(R语言) 筛选对应属的种名列仅为NA值的数据行

嘿,这个需求很好解决,核心就是按属分组后,筛选出组内所有种名(sp1)都是NA的属对应的行。我给你两种常用的R实现方案,你可以根据自己的习惯选:

方法一:用dplyr包(tidyverse生态,代码更直观)

如果你平时用tidyverse系列工具,这个方法可读性很高:

# 先安装并加载dplyr(如果还没装的话)
# install.packages("dplyr")
library(dplyr)

# 你的示例数据集
test <- data.frame(
  genus = c("Acicarpha", "Acicarpha", "Acicarpha", "Acicarpha", 
            "Acisanthera", "Acisanthera", "Acisanthera", "Acisanthera", 
            "Acmella", "Acmella"), 
  sp1 = c("NA", "bonariensis", "bonariensis", "spathulata", 
          NA, "variabilis", "variabilis", "variabilis", NA, NA)
)

# 注意:你的示例里有个"NA"是字符串,不是真正的缺失值,先转成标准NA(实际数据如果是标准NA可跳过)
test$sp1 <- ifelse(test$sp1 == "NA", NA, test$sp1)

# 核心筛选逻辑
result <- test %>%
  group_by(genus) %>%          # 按属名分组
  filter(all(is.na(sp1))) %>%  # 只保留组内所有sp1都是NA的组
  ungroup()                    # 取消分组(可选,但好习惯)

print(result)

运行后就能得到Acmella属的所有行啦。

方法二:用Base R(无需额外安装包)

如果不想装新包,用原生R代码也能搞定:

# 同样先处理字符串"NA"转标准NA(实际数据是标准NA可跳过)
test$sp1 <- ifelse(test$sp1 == "NA", NA, test$sp1)

# 先找出所有符合条件的属名:该属的sp1全部为NA
valid_genera <- names(
  which(tapply(test$sp1, test$genus, function(x) all(is.na(x))))
)

# 筛选这些属对应的行
result_base <- test[test$genus %in% valid_genera, ]

print(result_base)

这里用tapply按属分组判断,再用%in%匹配筛选,结果和上面完全一致。

补充一句:如果你的实际数据里sp1的NA都是R标准的缺失值(不是字符串"NA"),那转值的代码直接删掉就行,筛选逻辑完全通用~

内容的提问来源于stack exchange,提问作者hiperhiper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:52:33