R语言自定义函数处理数据框列时每行返回相同值的问题解决
问题修正:dplyr调用字符串重排函数输出异常
问题背景
编写了rearrange_name函数用于重排字符串,期望将类似"Accounting, The State Board of"的字符串转换为"The State Board of Accounting",但使用dplyr的mutate调用时,所有行输出均为"board"。
错误原因
- mutate参数传递错误:调用
mutate("board" = rearrange_name("board"))时,传入的是字符串"board"而非数据框的列名board,相当于给函数传递了固定字符串"board",导致所有行返回处理后的"board"。 - 函数未支持向量化处理:原函数仅能处理单个字符串,直接传入列向量(多个字符串)时,
strsplit(name, split = ",")[[1]]只会取第一个字符串的拆分结果,无法批量处理所有行。
修正方案
1. 将函数修改为支持向量化处理
使用sapply遍历输入的字符串向量,确保每个字符串都能被正确处理:
rearrange_name <- function(names) { sapply(names, function(name) { # 按逗号拆分字符串 split_name <- strsplit(name, split = ",")[[1]] if (length(split_name) > 1) { # 提取逗号后的部分(去掉首尾空格) prefix <- trimws(split_name[length(split_name)]) # 合并逗号前的所有部分(去掉首尾空格) rest <- trimws(paste(split_name[-length(split_name)], collapse = ",")) # 重新组合字符串 paste(prefix, rest) } else { # 无逗号则直接返回原字符串 name } }, USE.NAMES = FALSE) }
2. 修正mutate的调用方式
去掉列名的引号,传入实际的列向量:
board <- c( "Accounting, The State Board of", "Economists, The state Board of", "Medical Examiners, The State Board of " ) license <- data.frame(board) # 修正后的mutate调用 license <- license %>% mutate(board = rearrange_name(board))
验证结果
处理后的数据框license的board列输出为:
[1] "The State Board of Accounting" "The state Board of Economists" [3] "The State Board of Medical Examiners"
内容的提问来源于stack exchange,提问作者Tim Wilcox
相关产品推荐
相关产品推荐

