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

R语言中如何拼接非零值的列名与对应值生成新列?

解决方案

我来帮你修正这个问题~你原来的代码没有过滤掉值为0的列,所以所有列都被拼接进去了。我们只需要在生成拼接字符串的时候加个判断,只保留非零值对应的列即可,结合你用的data.table语法,修改后的代码如下:

cols <- colnames(data)[-1] # 保留score1到score6的列名

data[, rule := {
  # 遍历每个score列,仅当值不为0时生成"列名:值"格式的字符串
  rule_parts <- lapply(cols, function(x) {
    current_val <- get(x)
    if (current_val != 0) paste(x, current_val, sep = ":") else NULL
  })
  # 将非空的拼接部分用逗号连接,全为空则设为NA
  combined_rule <- paste(unlist(rule_parts), collapse = ",")
  ifelse(combined_rule == "", NA_character_, combined_rule)
}]

代码解释:

  • 首先在lapply的匿名函数里,我们先获取当前列的值current_val,判断它是否不等于0:如果是,就生成列名:值的字符串;如果是0,就返回NULL(这样后续拼接时会自动忽略)。
  • 接着用unlist把列表转成向量,再用paste(..., collapse = ",")把有效的拼接部分连起来。
  • 最后用ifelse判断:如果拼接后的字符串是空的(也就是所有列都是0),就赋值为NA,否则保留拼接结果。

这样运行后,就能得到你想要的rule列效果啦:全0的行对应NA,非零值的列名和值会按要求拼接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:35:27