You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中str_split非向量化运行问题及数据框污染物名称提取

问题解答

1. str_split()是否属于向量化函数?

str_split()是向量化函数,它会对输入的每个字符串独立执行拆分操作,返回一个列表(列表的每个元素对应原向量中单个字符串的拆分结果)。你代码出现错误的原因是:用[[1]]直接提取了列表的第一个元素(即第一个字符串的拆分结果),然后将这个值重复赋值给了所有行,导致第二行的污染物名称也被错误设置为"CO"。

2. 如何从数据框df中正确提取空气污染物名称?

以下是几种高效可行的方法:

方法一:结合map_chr()提取列表元素

利用purrr::map_chr()遍历str_split()返回的列表,提取每个列表元素的第4个值:

library(tidyverse)

df <- data.frame(x = c('data/raw/air/CO/2013.txt',
                       'data/raw/air/PM2.5/2013.txt'))

df %>% mutate(air = map_chr(str_split(x, "/"), ~ .x[4]))

输出结果:

x    air
1    data/raw/air/CO/2013.txt     CO
2 data/raw/air/PM2.5/2013.txt PM2.5

方法二:用str_split_fixed()直接生成矩阵提取列

str_split_fixed()会将拆分结果转换为矩阵,直接指定提取第4列即可:

df %>% mutate(air = str_split_fixed(x, "/", n = 5)[,4])

这里n = 5是因为每个路径会被拆分为5个部分,设置为大于等于实际拆分次数的数值即可。

方法三:正则表达式匹配提取

根据路径的结构规律,用str_extract()匹配air/之后、下一个/之前的内容:

df %>% mutate(air = str_extract(x, "(?<=air/)[^/]+"))

这个正则表达式的逻辑是:(?<=air/)是正向断言,确保匹配内容在air/之后;[^/]+匹配任意非斜杠的字符,直到遇到下一个斜杠为止。


内容的提问来源于stack exchange,提问作者zhiwei li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:25:43