使用dplyr mutate()修改字符串时所有行返回相同值的解决方法
问题原因与解决方法
错误原因
你的自定义函数shorten_text接收的是整个text_long列的向量,执行strsplit(df$text_long, ' ')时,会把每个字符串拆分后生成一个列表,unlist将其转为一维向量,取[1]只会拿到第一个拆分结果first,赋值给新列时这个标量会被循环填充到所有行,导致所有行结果相同。
正确实现方法
方法1:逐元素处理自定义函数
修改函数使其支持向量输入,或者在mutate中用purrr::map_chr逐行处理:
library(dplyr) library(purrr) # 用map_chr逐个处理text_long的元素 df <- df %>% mutate(text_short = map_chr(text_long, ~ unlist(strsplit(.x, ' '))[1]))
或者修改自定义函数,用sapply遍历向量:
shorten_text <- function(x) { sapply(x, function(y) unlist(strsplit(y, ' '))[1]) } df <- df %>% mutate(text_short = shorten_text(text_long))
方法2:直接字符串替换(最简便)
如果只是固定移除"row"单词,用gsub直接替换掉末尾的" row"更高效:
library(dplyr) df <- df %>% mutate(text_short = gsub("\\s+row$", "", text_long))
\\s+匹配一个或多个空格,$确保匹配字符串末尾的"row",避免误删其他位置的"row"。
方法3:拆分列取第一部分
用tidyr::separate拆分文本列,直接提取第一部分:
library(dplyr) library(tidyr) df <- df %>% separate(text_long, into = c("text_short", NA), sep = ' ', extra = 'drop')
extra = 'drop'表示丢弃拆分后的多余部分,NA表示不保留第二部分列。
内容的提问来源于stack exchange,提问作者Andrew Staroscik
相关产品推荐
相关产品推荐

