R语言:提取tibble列首词替换指定列NA值求助
问题分析与解决方案
原代码的问题
- 索引逻辑错误:
int(i/11)完全偏离需求——which(is.na(PRC[,2]))返回的就是第二列NA所在的行号i,直接用i定位即可,不需要做除法取整,这会导致修改错误的行。 - 第一个单词提取错误:
substr(PRC[int(i/11),7],6)是从第七列字符串的第6个字符开始截取,不是提取第一个单词,逻辑完全不符。 - 循环效率低且易出错:处理tibble这类数据结构,向量式操作比循环更高效、更不易出错。
正确实现方法
方法1:用tidyverse工具链(推荐)
需要加载dplyr和stringr包,用向量化操作一次性完成替换:
library(dplyr) library(stringr) PRC <- PRC %>% mutate( # 把state替换成你第二列的实际列名 state = if_else( is.na(state), # 把col7替换成你第七列的实际列名 word(col7, 1), state ) )
word()函数可以直接提取字符串的第n个单词,这里1就是第一个单词。- 替换代码里的占位符为你tibble中对应的实际列名即可。
方法2:基础R实现
如果不想用tidyverse,用基础R也能完成:
# 定位第二列NA的行位置 na_rows <- which(is.na(PRC[,2])) # 提取第七列第一个单词,替换到第二列NA位置 PRC[na_rows, 2] <- sapply(PRC[na_rows, 7], function(x) { strsplit(x, "\\s+")[[1]][1] })
- 若第七列本身也存在NA,可添加判断保留NA:
PRC[na_rows, 2] <- sapply(PRC[na_rows, 7], function(x) { if (is.na(x)) NA else strsplit(x, "\\s+")[[1]][1] })
内容的提问来源于stack exchange,提问作者Paola Rguez
相关产品推荐
相关产品推荐

