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

在R中合并R、V、B列名与值生成新列报错,求解决方案

问题解决

你的代码出错原因有两个:

  1. c_across()未指定目标列,默认包含了trtmt列,导致字符型列名和数值型列值的类型冲突;
  2. c_across() == c(2:4)的逻辑错误,这是将每行所有列的值和向量c(2,3,4)做比较,完全不符合“列名+对应值”的拼接需求。

以下是几种可行的解决方案:

方案1:dplyr rowwise 实现

library(dplyr)

df %>%
  rowwise() %>%
  mutate(key = paste0(names(pick(R:B)), c_across(R:B), collapse = "_")) %>%
  ungroup()
  • pick(R:B)精准获取需要拼接的列名;
  • c_across(R:B)获取当前行对应列的数值;
  • paste0将列名和数值逐个拼接,再用collapse="_"连接成字符串;
  • 最后用ungroup()取消行分组,避免后续操作受影响。

方案2:purrr pmap 高效实现(无需行分组)

library(dplyr)
library(purrr)

df %>%
  mutate(key = pmap_chr(select(., R:B), ~ paste0(names(select(., R:B)), c(...), collapse = "_")))
  • select(., R:B)筛选目标列;
  • pmap_chr逐行处理筛选后的列,将每行的数值传递给...,再和列名拼接。

方案3:Base R 简洁实现

df$key <- apply(df[, c("R", "V", "B")], 1, function(x) paste0(names(x), x, collapse = "_"))
  • apply按行处理目标列,每行数据作为x传入函数,直接拼接列名和对应值。

执行上述任意代码后,df都会生成符合预期的key列,示例输出如下:

# A tibble: 6 × 5
  trtmt     R     V     B key            
  <dbl> <dbl> <dbl> <dbl> <chr>          
1    26   150    50     0 R150_V50_B0    
2    28   150   150     0 R150_V150_B0   
3    35     0    50   100 R0_V50_B100    
4    42     0   150    50 R0_V150_B50    
5    49    25     0    50 R25_V0_B50     
6    63    25   100    25 R25_V100_B25

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:41:03