如何将R数据框中的向量列折叠为字符串并处理空值
处理str_extract_all生成的列表列:折叠向量并替换空值
你遇到的核心问题是str_extract_all返回的是列表列(每一行的test是一个独立的向量),直接用str_flatten()或paste(..., collapse=',')会把整个列表拆解成单一向量后折叠,自然会把整列变成一个字符串。要实现逐行处理,有两种简单方案:
方案1:用purrr::map_chr逐行处理
借助purrr的映射函数,对列表列的每个元素单独操作:
library(dplyr) library(stringr) library(purrr) t <- iris %>% mutate(test = str_extract_all(Species, 's\\w')) %>% arrange(Sepal.Width) %>% # 对每个test元素:空向量转NA,非空则折叠为逗号分隔字符串 mutate(test = map_chr(test, ~if (length(.x) == 0) NA_character_ else str_flatten(.x, ", "))) head(t)
执行后setosa对应的test会变成"se, sa",virginica对应的空向量会转为NA,其他单行匹配的结果保持原样。
方案2:用rowwise()逐行计算
通过rowwise()让dplyr按行处理数据,此时str_flatten只会作用于当前行的向量:
library(dplyr) library(stringr) t <- iris %>% mutate(test = str_extract_all(Species, 's\\w')) %>% arrange(Sepal.Width) %>% rowwise() %>% mutate(test = if (length(test) == 0) NA_character_ else str_flatten(test, ", ")) %>% ungroup() # 记得取消按行分组,避免后续操作受影响 head(t)
两种方案效果完全一致,选你习惯的语法即可。
另外补充:str_extract()只能提取第一个匹配项,无法直接得到所有匹配项的折叠结果,所以必须先用str_extract_all获取所有匹配,再处理列表列。
内容的提问来源于stack exchange,提问作者Théodore Targerian
相关产品推荐
相关产品推荐

