如何在R语言中基于条件语句从逗号分隔列创建新列
处理逗号分隔字符串生成二元标记列
先看原始数据:
favorite_fruits <- c("apples,grapes,oranges," , "apples" , "grapes, oranges" , "oranges" ,"apples,grapes,oranges," , "apples" , "grapes,oranges" , "oranges")
下面提供两种实用的R语言实现方式,生成apples、grapes、oranges三个标记列,存在对应水果则值为1,否则为0:
方法一:Base R 原生实现
不需要额外安装包,直接用基础函数搞定:
# 原始数据 favorite_fruits <- c("apples,grapes,oranges," , "apples" , "grapes, oranges" , "oranges" ,"apples,grapes,oranges," , "apples" , "grapes,oranges" , "oranges") # 指定要检查的水果列表 target_fruits <- c("apples", "grapes", "oranges") # 生成标记列:清理字符串后检查是否包含目标水果,转成1/0 fruit_flags <- sapply(target_fruits, function(fruit) { # 清理首尾空格,把逗号/多空格换成单个空格 cleaned_str <- trimws(gsub("[, ]+", " ", favorite_fruits)) # 用单词边界匹配完整水果名,避免部分匹配,转成整数 as.integer(grepl(paste0("\\b", fruit, "\\b"), cleaned_str)) }) # 合并原始数据和标记列成数据框 result_df <- data.frame(favorite_fruits, fruit_flags) print(result_df)
运行后会得到包含原始列和三个标记列的数据框,自动处理了原数据里的末尾逗号、空格不一致问题。
方法二:tidyverse 工具链实现
适合习惯tidy风格的用户,代码更直观:
library(tidyverse) # 把原始数据转成 tibble df <- tibble(favorite_fruits = c("apples,grapes,oranges," , "apples" , "grapes, oranges" , "oranges" ,"apples,grapes,oranges," , "apples" , "grapes,oranges" , "oranges")) # 一步步处理生成标记列 result_df <- df %>% # 清理字符串:逗号换空格,去掉多余空格 mutate(cleaned_fruits = str_squish(gsub(",", " ", favorite_fruits))) %>% # 把每行的水果拆分成单独行 separate_rows(cleaned_fruits, sep = " ") %>% # 过滤掉空字符串(原数据末尾逗号导致的空值) filter(cleaned_fruits != "") %>% # 标记存在的水果为1 mutate(flag = 1) %>% # 转成宽表,不存在的水果填充0 pivot_wider(names_from = cleaned_fruits, values_from = flag, values_fill = 0) %>% # 和原始数据合并 left_join(df, ., by = character()) %>% # 调整列顺序,把原始列放前面 select(favorite_fruits, apples, grapes, oranges) print(result_df)
两种方法最终输出的结果一致,可根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者KCS
相关产品推荐
相关产品推荐

