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

R语言:如何基于4个dummy variables生成技术采纳组合新变量

逐行生成技术采纳组合变量的实现方法

aggregate是用于跨分组聚合统计的函数,和你需要的逐行拼接采纳技术编号的行内处理逻辑不匹配,以下两种方法可以直接得到你预期的输出,处理14000行量级的数据完全没有性能压力。

核心逻辑

你的4个技术列顺序固定为tech1、tech2、tech3、tech4,逐行定位当前行中取值为"1"的列,把对应的列序号(即约定的技术编号1/2/3/4)拼接成字符串,即可生成符合格式要求的新变量。

实现方案

方案1:无额外依赖的基础R实现

性能最优,适合处理超大型数据表,代码如下:

# 筛选出所有tech开头的目标列
tech_cols <- grep("^tech[1-4]$", names(df), value = TRUE)
# 把目标列转成矩阵方便逐行处理
tech_mat <- as.matrix(df[, tech_cols])

# 逐行匹配值为"1"的列,拼接对应技术编号
df$Tech <- apply(tech_mat, 1, \(row) {
  paste(which(row == "1"), collapse = "")
})

运行输出结果和你给出的预期完全匹配:

  • 第1行:tech1=1、tech2=1 → 拼接为"12"
  • 第2行:仅tech2=1 → 拼接为"2"
  • 第3行:tech2=1、tech3=1、tech4=1 → 拼接为"234"
  • 第4行:仅tech2=1 → 拼接为"2"

注意:你当前的tech列是因子类型,代码里直接匹配实际存储的字符值"1",不会出现因子层级编码和实际取值不匹配的判断错误。如果存在某一行所有技术都未采纳(即4列全为0)的情况,拼接结果会是空字符串,可以按需替换为自定义标识,例如:

df$Tech <- ifelse(df$Tech == "", "0", df$Tech)

方案2:tidyverse风格的流程化实现

代码可读性更强,适合和其他数据清洗步骤串联使用:

library(tidyverse)

df <- df %>%
  rowwise() %>%
  # 逐行定位取值为"1"的tech列,拼接对应编号
  mutate(Tech = str_c(
    which(c_across(starts_with("tech")) == "1"),
    collapse = ""
  )) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 22:27:04