R语言按input列前两个字符串匹配批量更新多列方法咨询
问题背景
现有R语言数据框结构如下,需要按照规则填充n1、n2、n3三列的缺失值:
df <- data.frame(input = c("Antidesma cuspidatum Mull.Arg.", "Antidesma cuspidatum Müll.Arg.", "Alchornea parviflora (Benth.) Mull.Arg.", "Alchornea parviflora (Benth.) Müll.Arg."), n1 = c("Antidesma cuspidatum", NA, "Alchornea parviflora", NA), n2 = c("Antidesma", NA, "Alchornea", NA), n3 = c("Phyllanthaceae", NA, "Euphorbiaceae", NA))
原始数据打印结果:
| input | n1 | n2 | n3 |
|---|---|---|---|
| Antidesma cuspidatum Mull.Arg. | Antidesma cuspidatum | Antidesma | Phyllanthaceae |
| Antidesma cuspidatum Müll.Arg. | |||
| Alchornea parviflora (Benth.) Mull.Arg. | Alchornea parviflora | Alchornea | Euphorbiaceae |
| Alchornea parviflora (Benth.) Müll.Arg. |
需求说明
将input列前两个单词相同的行归为同一组,同一组内的n1、n2、n3三列统一使用组内已有的有效值填充缺失值,最终期望结果如下:
| input | n1 | n2 | n3 |
|---|---|---|---|
| Antidesma cuspidatum Mull.Arg. | Antidesma cuspidatum | Antidesma | Phyllanthaceae |
| Antidesma cuspidatum Müll.Arg. | Antidesma cuspidatum | Antidesma | Phyllanthaceae |
| Alchornea parviflora (Benth.) Mull.Arg. | Alchornea parviflora | Alchornea | Euphorbiaceae |
| Alchornea parviflora (Benth.) Müll.Arg. | Alchornea parviflora | Alchornea | Euphorbiaceae |
实现方案
方案1:tidyverse生态实现(代码可读性高)
依赖dplyr做分组操作、stringr做文本拆分,代码如下:
library(dplyr) library(stringr) df_result <- df %>% # 提取input前两个单词作为分组标识 mutate(group_id = word(input, start = 1, end = 2)) %>% group_by(group_id) %>% # 对目标三列用组内第一个非缺失值填充所有行 mutate(across(c(n1, n2, n3), ~ na.omit(.x)[1])) %>% ungroup() %>% # 移除临时分组列 select(-group_id)
方案2:base R实现(无需安装第三方包)
使用基础函数strsplit拆分文本、ave做分组填充,代码如下:
# 生成分组标识 group_id <- sapply(strsplit(df$input, split = " "), function(x) paste(x[1:2], collapse = " ")) # 逐列分组填充缺失值 df$n1 <- ave(df$n1, group_id, FUN = function(col) na.omit(col)[1]) df$n2 <- ave(df$n2, group_id, FUN = function(col) na.omit(col)[1]) df$n3 <- ave(df$n3, group_id, FUN = function(col) na.omit(col)[1])
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

