在R语言中通过Key列拆分值填充数据框中的NA值
这里有两种可行的方法来实现你的需求,一种是使用tidyverse工具包(代码更简洁直观),另一种是纯Base R的方案,你可以根据自己的习惯选择:
方法1:使用tidyr的separate_wider_delim(推荐)
这个函数可以直接按指定分隔符拆分列,并且自动匹配到目标列,非常适合你的场景:
# 如果未安装tidyverse包,先执行 install.packages("tidyverse") library(tidyverse) # 拆分Key列并填充对应字段 Linking <- Linking %>% separate_wider_delim( cols = Key, delim = "_", names = c("ID", "PSU", "qtr"), cols_remove = FALSE, # 保留Key列,不需要的话可设为TRUE fill = "right" ) %>% # 转换数据类型,和原始数据保持一致 mutate( ID = as.integer(ID), qtr = as.integer(qtr) )
执行后,原数据中21-24行的ID、PSU、qtr字段会被Key拆分出的值自动填充,且数据类型和其他行保持统一。
方法2:纯Base R方案
如果你不想加载额外的包,可以用Base R原生函数完成:
# 定位需要填充的行(ID为NA的行) target_rows <- which(is.na(Linking$ID)) # 拆分目标行的Key字段 split_result <- strsplit(Linking$Key[target_rows], "_") # 分别赋值到对应列 Linking$ID[target_rows] <- sapply(split_result, function(x) as.integer(x[1])) Linking$PSU[target_rows] <- sapply(split_result, function(x) x[2]) Linking$qtr[target_rows] <- sapply(split_result, function(x) as.integer(x[3]))
这个逻辑是先找到需要填充的行,再拆分Key字段提取对应位置的值,最后转换类型后赋值到目标列。
你可以用print(Linking[21:24, ])来验证填充结果是否正确。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

