【问题标题】:use dplyr to combine columns of data.frame when column names are not known当列名未知时,使用 dplyr 组合 data.frame 的列
【发布时间】:2020-11-23 16:18:17
【问题描述】:

给定一个小标题:

library(tibble)
myTibble <- tibble(a = letters[1:3], b = c(T, F, T), c = 1:3)

我可以使用transmute 粘贴列,用'.'分隔:

> library(dplyr)
> transmute(myTibble, concat = paste(a, b, c, sep = "."))
# A tibble: 3 x 1
  concat   
  <chr>    
1 a.TRUE.1 
2 b.FALSE.2
3 c.TRUE.3 

如果我想在接收 tibble 的函数中使用上述 transmute 语句,我不会提前知道 tibble 的名称或列数。什么 dplyr 语法可以让我 paste 以“。”分隔的小标题中的所有列?

请注意,我可以这样做:

> apply(myTibble, 1, paste, collapse = ".")
[1] "a.TRUE.1"  "b.FALSE.2" "c.TRUE.3" 

但我想更好地理解 dplyr。所以,是的,这是我试图解决的一个具体问题,但我也很困惑为什么我不能用 dplyr 解决它,这意味着我还不明白关于 dplyr 列选择的一些关键,并且我想学习,这就是为什么我要专门询问 dplyr 解决方案。

【问题讨论】:

  • tidyr::unite(myTibble, concat, everything())
  • 如果你需要点,你可以启用sep这样tidyr::unite(myTibble, concat, everything(),sep='.')
  • base,不是dplyr,但你也可以使用do.call(paste, myTibble, sep = ".")
  • do.call 解决方案是do.call(paste, c(myTibble, list(sep = ".")))。同样,我在这里的部分问题是尝试了解更多关于使用 dplyr 选择列的信息。如果有人不仅可以告诉我如何选择所有列,还可以描述为什么任何解决方案都有效,我将不胜感激!

标签: r select dplyr tibble


【解决方案1】:

经过一些试验和错误:

colNames_as_symbols <- syms(names(myTibble))
transmute(myTibble, concat = paste(!!!colNames_as_symbols, sep = '.'))

这是让我找到解决方案的提示......来自!!!的文档:

大爆炸算子!!!强制拼接对象列表。这 列表的元素被拼接在适当的位置,这意味着它们每个 成为一个单一的论点。

vars <- syms(c("height", "mass"))

强制拼接相当于单独提供元素:

starwars %>% select(!!!vars)
starwars %>% select(height, mass)

事实上,标题为“表达式的强制部分”的整个文档读起来很有趣。可以通过发出?qq_show访问它

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多