在R中合并R、V、B列名与值生成新列报错,求解决方案
问题解决
你的代码出错原因有两个:
c_across()未指定目标列,默认包含了trtmt列,导致字符型列名和数值型列值的类型冲突;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
相关产品推荐
相关产品推荐

