【问题标题】:Paste multiple columns based on other columns names - R根据其他列名称粘贴多列 - R
【发布时间】:2019-07-24 14:17:48
【问题描述】:

我正在寻找一种基于某些列名称将多个列组合在一起的方法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 函数,但我不知道如何继续。有人可以帮帮我吗?

谢谢。

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

【问题讨论】:

标签: r


【解决方案1】:

一个选项是使用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)

【讨论】:

  • 非常感谢阿克伦!
  • 快速提问,如果我有 100 个这样的列怎么办?有没有办法粘贴它们而不必做c(1,3)c(2.4) 等?
  • @Gainz。我会根据grep 的模式进行选择,即。 i1 &lt;- grepl('pct', names(data)); lapply(list(!i1, i1), function(x)
  • 谢谢,这是我真正想要的,我应该让我的问题更清楚!谢谢,当堆栈也允许我时,我会接受答案。
  • @Gainz 如果我们使用i1, !i1 它将是Map(function(x, y) sprintf("%d %0.2f", x, y), data[!i1], data[i1])
猜你喜欢
  • 2022-11-28
  • 2017-07-29
  • 2019-04-10
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多