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

在R语言中按列值复制行并将值转0/1的实现方法问询

解决R语言中按列值复制行并转换为1/0编码的问题

嘿,这个需求在R里用tidyverse工具链就能轻松搞定!我给你一步步拆解,从示例数据到具体代码,保证清晰易懂。

第一步:准备示例数据

先构造一个贴近你需求的示例数据集——假设我们有id列和包含多值的categories列(用逗号分隔多个类别):

library(tidyverse)

# 原始数据集
original_df <- tibble(
  id = c(1, 2, 3),
  categories = c("A,B", "B,C", "A")
)

print(original_df)
#> # A tibble: 3 × 2
#>      id categories
#>   <dbl> <chr>     
#> 1     1 A,B       
#> 2     2 B,C       
#> 3     3 A

第二步:按列值拆分并复制行

用separate_rows()函数把多值列拆分成单独的行,每个类别对应一行,同时保留其他列的信息:

# 拆分多值列,生成多行
split_df <- original_df %>%
  separate_rows(categories, sep = ",")

print(split_df)
#> # A tibble: 5 × 2
#>      id categories
#>   <dbl> <chr>     
#> 1     1 A         
#> 2     1 B         
#> 3     2 B         
#> 4     2 C         
#> 5     3 A

第三步:转换为1/0编码格式

接下来把类别列转换成1/0的one-hot编码列。这里分两种常见场景:

场景1:每个原始行对应一行,所有匹配的类别为1

如果希望每个原始id对应一行,该行中所有属于它的类别标记为1,其他为0:

# 宽格式:每个id一行,类别列对应1/0
wide_df <- split_df %>%
  mutate(value = 1) %>%
  pivot_wider(
    names_from = categories,
    values_from = value,
    values_fill = 0
  )

print(wide_df)
#> # A tibble: 3 × 4
#>      id     A     B     C
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     1     1     1     0
#> 2     2     0     1     1
#> 3     3     1     0     0

场景2:每个拆分后的行对应一行,仅当前类别为1

如果希望拆分后的每一行仅对应一个1(其余类别为0),可以这样做:

# 长格式转宽格式,每行仅当前类别为1
final_df <- split_df %>%
  # 生成所有唯一类别列表
  mutate(all_categories = list(unique(split_df$categories))) %>%
  unnest(all_categories) %>%
  # 判断当前类别是否匹配,标记1/0
  mutate(value = ifelse(categories == all_categories, 1, 0)) %>%
  # 转成宽格式
  pivot_wider(
    names_from = all_categories,
    values_from = value
  ) %>%
  # 可选:移除原categories列
  select(-categories)

print(final_df)
#> # A tibble: 5 × 4
#>      id     A     B     C
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     1     1     0     0
#> 2     1     0     1     0
#> 3     2     0     1     0
#> 4     2     0     0     1
#> 5     3     1     0     0

关键函数解释

  • separate_rows():自动拆分多值列并复制行,支持自定义分隔符(比如空格、分号,修改sep参数即可)。
  • pivot_wider():把长格式数据转换为宽格式,values_fill=0确保未匹配的类别填充为0。
  • ifelse():简单直观的条件判断,实现1/0的标记。

内容的提问来源于stack exchange,提问作者Shelby Grossman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:44:18