You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:45:54