R数据框作者名字列格式化:原方案重复输出所有内容
格式化数据框中的作者姓名(解决重复输出问题)
问题描述
尝试对R数据框中整列的作者名字字符串进行格式化,但运行代码后,所有行的new_names列都重复输出了所有行的作者名字,而非对应行的格式化结果。
原问题复现代码
library(dplyr) x <- data.frame( names = c("Daenerys Targaryen, George R. R. Martin, Luís Inácio Lula da Silva", "Hadley Alexander Wickham, Joseph J. Allaire", "Stack Overflow" ) ) format_names <- function(variable) { variable %>% strsplit(", ") %>% unlist() %>% gsub("(.*?) (\\w+$)", "\\U\\2\\E, \\1", ., perl = TRUE) %>% gsub(" ([A-Z])\\w*\\.?", " \\1.", .) %>% paste(collapse = "; ") } x %>% mutate(new_names = format_names(names))
运行后所有行的new_names都会输出全部作者的格式化名字,而非对应行的内容。
问题原因
原函数format_names接收的是整个names列的向量,strsplit后得到的是包含所有行名字分割结果的列表,unlist会将所有行的名字元素合并成一个大向量,最后paste(collapse = "; ")把所有元素拼接成一个字符串,导致每一行都重复这个完整字符串。
解决方案
需要让函数逐行处理每个名字字符串,以下两种方法都可以解决:
方法1:使用rowwise()分组处理
library(dplyr) x <- data.frame( names = c("Daenerys Targaryen, George R. R. Martin, Luís Inácio Lula da Silva", "Hadley Alexander Wickham, Joseph J. Allaire", "Stack Overflow" ) ) format_names <- function(variable) { variable %>% strsplit(", ") %>% unlist() %>% gsub("(.*?) (\\w+$)", "\\U\\2\\E, \\1", ., perl = TRUE) %>% gsub(" ([A-Z])\\w*\\.?", " \\1.", .) %>% paste(collapse = "; ") } x %>% rowwise() %>% # 按行分组 mutate(new_names = format_names(names)) %>% ungroup() # 取消分组
方法2:使用purrr::map_chr()逐元素处理
library(dplyr) library(purrr) x %>% mutate(new_names = map_chr(names, format_names))
两种方法都会让format_names函数单独处理每一行的名字字符串,最终new_names列会对应输出该行作者名字的格式化结果。
内容的提问来源于stack exchange,提问作者Bruno Mioto
相关产品推荐
相关产品推荐

