类似于this个问题,我想连接列值的子集.但是,我还想用列的名称作 for each 值的前缀,用":"分隔名称和值,并控制用于分隔名称/值对的字符.

例如,这给了我值的串联:

library(data.table)
d <- data.table(x = c(1, 2), y = c(3, 4))

labs_to_get <- c("x", "y")


d[
  ,
  .(x, y, labs = do.call(paste, c(.SD, sep = ", "))),
  .SDcols = labs_to_get
]
#>    x y labs
#> 1: 1 3 1, 3
#> 2: 2 4 2, 4

但我在找这个:

d[
  ,
  .(x, y, labs = c("x: 1, y: 3", "x: 2, y: 4"))
]
#>    x y       labs
#> 1: 1 3 x: 1, y: 3
#> 2: 2 4 x: 2, y: 4

reprex package(v2.0.1)于2022-04-01创建

推荐答案

我们可以用Map个名字对应paste个名字

d[,
  .(x, y, labs = do.call(paste, c(Map(function(u, v) 
       paste0(v, ": ", u), .SD, labs_to_get), sep = ", "))),
  .SDcols = labs_to_get
]

-输出

     x     y       labs
   <num> <num>     <char>
1:     1     3 x: 1, y: 3
2:     2     4 x: 2, y: 4

或者另一个选项是write.dcf

d[, labs := do.call(paste, 
        c(as.list(setdiff(capture.output(write.dcf(.SD)), "")), 
     sep = ", ")), 1:nrow(d)]
> d
       x     y       labs
   <num> <num>     <char>
1:     1     3 x: 1, y: 3
2:     2     4 x: 2, y: 4

或者使用apply在行上循环

d[, labs := apply(.SD, 1, \(x) paste(names(x), x, sep = ": ", 
    collapse = ", ")), .SDcols = labs_to_get]

或者用tidyverse

library(dplyr)
library(purrr)
library(stringr)
d %>% 
  mutate(labs = invoke(str_c, c(across(all_of(labs_to_get),  
      ~str_c(cur_column(), ": ", .x)), sep = ", ")))
       x     y       labs
   <num> <num>     <char>
1:     1     3 x: 1, y: 3
2:     2     4 x: 2, y: 4

R相关问答推荐

过滤器数据.基于两列的帧行和R中的外部向量

将向量组合到一个数据集中,并相应地命名行

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

在GGPLATE中将突出的点放在前面

如何在Chart_Series()中更改轴值的 colored颜色 ?

如何在一次运行中使用count进行多列计数

使用列/行匹配将两个不同维度的矩阵相加

在ggplot2的框图中绘制所有级别的系数

从多个线性回归模型中提取系数

如何在PackageStatus()中列出&q;不可用的包&q;?

Data.table';S GForce-将多个函数应用于多列(带可选参数)

使用R将简单的JSON解析为嵌套框架

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

将统计检验添加到GGPUBR中的盒图,在R

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

通过匹配另一个表(查找表)中的列值来填充数据表,并在另一个变量上进行内插

带有Bootswatch Cerulean主题的shiny 仪表板中的浏览&按钮可见性问题

如果y中存在x中的值,则将y行中的多个值复制到相应的x行中

R:部分修改矩阵对角线的有效方法

获取列位置