我正在寻找一种基于某些列名将多个列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()
进行操作。因此,我想知道是否有一种方法可以像输出中那样将name
与name_pct
匹配的所有列粘贴在一起。
我已经尝试过lapply()
和一些loop
的一些尝试,但是没有成功。我知道我必须以某种方式使用字符串_pct
和可能的names
函数,但是我不确定如何进行此操作。有人可以帮我吗?
谢谢。
编辑:列名是未知的,因为它们是函数的一部分。
答案 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)