R语言管道符中mutate结合==比较字符串报错求助
解决R语言中逐字符比较字符串并生成布尔向量的问题
错误原因
你用str_split拆分字符串后得到的是列表列(每个单元格存储一个字符向量),直接用==比较两个列表列时,R无法处理这种类型的比较,因此报错。
解决方案
需要用purrr::map2函数,对每行的两个拆分后的字符向量进行逐元素比较,再转换为数字格式。以下是修正后的代码:
# 加载所需包 library(tidyverse) library(readxl) # 读取Excel文件 Score <- read_excel(Score_Path_LINUX) # 处理数据生成目标列 Bool <- Score %>% mutate(KEY_split = str_split(KEY, ""), Tim_split = str_split(Tim_Ans, ""), # 使用map2逐行比较两个拆分后的向量,转成数字 Tim_Bool = map2(KEY_split, Tim_split, ~ as.numeric(.x == .y))) %>% view()
测试验证
如果用你给出的测试数据:
test_data <- tibble(KEY = "BBSS", Tim_Ans = "BBBB") test_result <- test_data %>% mutate(KEY_split = str_split(KEY, ""), Tim_split = str_split(Tim_Ans, ""), Tim_Bool = map2(KEY_split, Tim_split, ~ as.numeric(.x == .y)))
test_result$Tim_Bool会得到[[1]] [1] 1 1 0 0,完全符合你的期望输出。
补充说明
map2(.x, .y, .f)会遍历.x和.y的每一对元素,对它们应用函数.f;这里.x对应KEY_split的每个列表元素,.y对应Tim_split的每个列表元素。- 如果需要把
Tim_Bool的列表列展开成多个独立列(每个字符对应一列),可以追加unnest_wider操作:
Bool <- Score %>% mutate(KEY_split = str_split(KEY, ""), Tim_split = str_split(Tim_Ans, ""), Tim_Bool = map2(KEY_split, Tim_split, ~ as.numeric(.x == .y))) %>% unnest_wider(Tim_Bool, names_sep = "_") %>% view()
内容的提问来源于stack exchange,提问作者Ron Raven
相关产品推荐
相关产品推荐

