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
相关产品推荐
相关产品推荐

