R语言:将wk#列NA值替换为前一列字符串首字符
问题说明
现有一列数据标签为1.2.a.2021格式的字符串,需要将当前填充为NA的wk#列对应行值,替换为对应字符串的首个数字(示例取值为1)。已尝试使用strsplit()函数拆分字符串为字符元素、或转换为数值类型,需要实现逐行提取第一列字符串首段数字,填充到wk#列对应位置。数据集覆盖13个周、共数百条数据点,示例数据结构如下:
| sample | ng | wk# |
|---|---|---|
| 1.2.a.2021 | 0.4 | NA |
实现方案
按需求编写的for循环版本
假设数据框对象名为df,逐行循环填充代码如下:
# 逐行遍历数据 for (row_idx in 1:nrow(df)) { # 按.分隔符拆分sample列字符串,注意.需要正则转义 str_parts <- strsplit(df$sample[row_idx], split = "\\.")[[1]] # 取拆分后第一个元素,转为数值后赋值给wk#列对应位置 df$`wk#`[row_idx] <- as.numeric(str_parts[1]) }
注意事项:
.是正则表达式通配符,直接写会匹配所有字符,必须加双反斜杠转义为\\.才能正确按点号拆分- 填充前确认
wk#列的类型支持数值存储,避免类型不兼容报错
更高效的向量化实现(推荐)
R语言中向量化操作运行效率远高于逐行for循环,代码也更简洁,适合几百到十万级数据量处理,两种常用写法:
# 写法1:基础R实现,不用额外装包 df$`wk#` <- as.numeric(sapply(strsplit(df$sample, "\\."), `[`, 1)) # 写法2:用stringr包直接提取开头数字,逻辑更直观 # 首次使用需先安装:install.packages("stringr") library(stringr) df$`wk#` <- as.numeric(str_extract(df$sample, "^\\d"))
运行后示例输出结果:
| sample | ng | wk# |
|---|---|---|
| 1.2.a.2021 | 0.4 | 1 |
内容的提问来源于stack exchange,提问作者Lheg
相关产品推荐
相关产品推荐

