根据其他列名称粘贴多列-R

时间:2019-07-24 14:17:48

标签: r

我正在寻找一种基于某些列名将多个列paste在一起的方法。我已经在堆栈上寻找将列粘贴和连接在一起的信息,但是没有找到我想要的东西。

样本数据:

data <- data.frame(col1= c(10,20),
                   col2= c(4,8),
                   col1_pct= c(0.20, 0.30),
                   col2_pct= c(0.40, 0.87))

Output :

  col1 col2 col1_pct col2_pct
1   10    4      0.2     0.40
2   20    8      0.3     0.87

我想要的输出:

 col1_new col2_new
1   10 (0.2)   4 (0.40)
2   20 (0.3)   8 (0.87)

实际数据包含很多列,因此我不能简单地手动paste()进行操作。因此,我想知道是否有一种方法可以像输出中那样将namename_pct匹配的所有列粘贴在一起。

我已经尝试过lapply()和一些loop的一些尝试,但是没有成功。我知道我必须以某种方式使用字符串_pct和可能的names函数,但是我不确定如何进行此操作。有人可以帮我吗?

谢谢。

编辑:列名是未知的,因为它们是函数的一部分。

1 个答案:

答案 0 :(得分:2)

一种选择是通过遍历备用列来使用sprintf

data.frame(setNames(lapply(list(c(1,3), c(2, 4)), function(i) 
     do.call(sprintf, c(fmt = "%d (%0.2f)",
        data[i]))), paste0(names(data)[1:2], "_new")))
#   col1_new col2_new
#1 10 (0.20) 4 (0.40)
#2 20 (0.30) 8 (0.87)

它也可以转换成tidyverse

library(tidyverse0
map2_df(data %>% 
           select(1:2), 
        data %>% 
           select(matches("pct")), ~  sprintf("%d (%0.2f)", .x, .y)) %>%
   rename_all(~ str_c(., "_new"))
# A tibble: 2 x 2
# col1_new  col2_new
#  <chr>     <chr>   
#1 10 (0.20) 4 (0.40)
#2 20 (0.30) 8 (0.87)