R语言字符串截取与NA值向前填充的实现问询
解决方案
我来帮你一步步搞定这两个操作,直接上代码和详细解释:
1. 截取路径中的核心标识
我们需要从路径字符串里提取出111L这类核心标识,这里有两种实用方法,选你顺手的来:
方法一:用stringr包(直观好理解)
如果还没装过这个包,先安装加载:
install.packages("stringr") library(stringr)
然后用正则提取目标内容:
# 原始数据 pic_names <- c("../img/pics/111L.jpg", NA, "../img/pics/134L.jpg",NA, "../img/pics/164L.jpg", NA, "../img/pics/187L.jpg", NA) df <- as.data.frame(pic_names) # 新增列存储核心标识 df$core_id <- str_extract(df$pic_names, "(?<=/)[^/.]+(?=\\.)")
这里的正则(?<=/)[^/.]+(?=\\.)逻辑很简单:专门匹配最后一个/之后、.之前的所有非/非.字符,正好就是我们要的111L这类标识。
方法二:用base R(无需额外装包)
要是不想加新包,用基础包的sub()函数也能实现:
df$core_id <- sub(".*/([^/.]+)\\..*", "\\1", df$pic_names)
这个正则的思路是:把路径里从开头到最后一个/的内容,以及.之后的内容全部替换掉,只保留中间捕获的核心部分。
2. 用前一行有效字符串填充NA
这一步推荐用zoo包的na.locf()函数(全称是"last observation carried forward",直白说就是把上一行的有效值往下填),先处理包的问题:
install.packages("zoo") library(zoo)
然后一行代码搞定填充:
df$core_id_filled <- na.locf(df$core_id)
要是想纯用基础R写,也可以整个简单循环:
df$core_id_filled <- df$core_id for (i in 2:nrow(df)) { if (is.na(df$core_id_filled[i])) { df$core_id_filled[i] <- df$core_id_filled[i-1] } }
完整代码&最终结果
把两步整合起来,完整代码如下:
# 加载所需工具包 library(stringr) library(zoo) # 原始数据 pic_names <- c("../img/pics/111L.jpg", NA, "../img/pics/134L.jpg",NA, "../img/pics/164L.jpg", NA, "../img/pics/187L.jpg", NA) df <- as.data.frame(pic_names) # 步骤1:提取核心标识 df$core_id <- str_extract(df$pic_names, "(?<=/)[^/.]+(?=\\.)") # 步骤2:填充NA值 df$core_id_filled <- na.locf(df$core_id) # 查看最终结果 print(df)
运行后会得到这样的输出:
pic_names core_id core_id_filled 1 ../img/pics/111L.jpg 111L 111L 2 NA <NA> 111L 3 ../img/pics/134L.jpg 134L 134L 4 NA <NA> 134L 5 ../img/pics/164L.jpg 164L 164L 6 NA <NA> 164L 7 ../img/pics/187L.jpg 187L 187L 8 NA <NA> 187L
内容的提问来源于stack exchange,提问作者Gianluca
相关产品推荐
相关产品推荐

