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
相关产品推荐
相关产品推荐

