使用dplyr生成数据框有序交互列时的字符串突变问题
问题排查:dplyr mutate批量处理字符串失效的原因及解决方法
数据框结构
# 原始数据框dput信息 structure(list(interaction = c("A pp B", "A pp G", "G pp A", "A pp J", "J pp A", "Q pp A"), alphabetical = c("ABpp", "AGpp", "AGpp", "AJpp", "AJpp", "AppQ")), row.names = c(NA, 6L), class = "data.frame")
输出预览:
interaction alphabetical 1 A pp B ABpp 2 A pp G AGpp 3 G pp A AGpp 4 A pp J AJpp 5 J pp A AJpp 6 Q pp A AppQ
需求
基于alphabetical列生成新列correct_order_interaction,将列中字符串的前两个字母以"X pp Y"的格式输出(例如AGpp转为"A pp G")。
尝试的代码及问题
使用以下代码后,所有行的correct_order_interaction结果均为"A pp B",未实现逐行处理:
d <- d %>% mutate( correct_order_interaction = paste( unlist(strsplit(as.character(alphabetical),""))[1], "pp", unlist(strsplit(as.character(alphabetical),""))[2] ) )
错误输出:
interaction alphabetical correct_order_interaction 1 A pp B ABpp A pp B 2 A pp G AGpp A pp B 3 G pp A AGpp A pp B 4 A pp J AJpp A pp B 5 J pp A AJpp A pp B 6 Q pp A AppQ A pp B
失效原因
strsplit(as.character(alphabetical), "")会对整个alphabetical列的所有字符串进行拆分,返回一个包含多个列表的大列表;unlist()后会将所有字符合并成一个一维向量,此时取[1]和[2]只会拿到第一行字符串拆分后的前两个字符(即"A"和"B"),导致所有行复用这两个值。
解决方法
方法1:使用rowwise()逐行处理
通过rowwise()让mutate按行执行操作,确保每行的字符串拆分独立进行:
library(dplyr) d <- d %>% rowwise() %>% mutate( correct_order_interaction = paste( strsplit(alphabetical, "")[[1]][1], "pp", strsplit(alphabetical, "")[[1]][2] ) ) %>% ungroup() # 取消按行分组,避免后续操作受影响
方法2:使用purrr::map_chr逐行映射
利用purrr包的map_chr函数对每行的alphabetical值单独处理,效率比rowwise()更高:
library(dplyr) library(purrr) d <- d %>% mutate( correct_order_interaction = map_chr(alphabetical, function(x) { chars <- strsplit(x, "")[[1]] paste(chars[1], "pp", chars[2]) }) )
方法3:字符串截取(最优解)
观察alphabetical列的结构,目标字符是字符串的前两位,直接用stringr包的str_sub截取,代码更简洁高效:
library(dplyr) library(stringr) d <- d %>% mutate( correct_order_interaction = paste( str_sub(alphabetical, 1, 1), "pp", str_sub(alphabetical, 2, 2) ) )
正确输出
interaction alphabetical correct_order_interaction 1 A pp B ABpp A pp B 2 A pp G AGpp A pp G 3 G pp A AGpp A pp G 4 A pp J AJpp A pp J 5 J pp A AJpp A pp J 6 Q pp A AppQ A pp p
内容的提问来源于stack exchange,提问作者Salt_Industry
相关产品推荐
相关产品推荐

