存储在变量中的dplyr concat列(变异和非标准评估)

Rob*_*inL 3 r dplyr nse mutate

我想基于变量连接数据框中的任意数量的列 cols_to_concat

df <- dplyr::data_frame(a = letters[1:3], b = letters[4:6], c = letters[7:9])
cols_to_concat = c("a", "b", "c")
Run Code Online (Sandbox Code Playgroud)

要使用此特定值获得所需结果,cols_to_concat我可以这样做:

df %>% 
  dplyr::mutate(concat = paste0(a, b, c))
Run Code Online (Sandbox Code Playgroud)

但我需要概括一下,使用类似这样的语法

# (DOES NOT WORK)
df %>% 
  dplyr::mutate(concat = paste0(cols))
Run Code Online (Sandbox Code Playgroud)

我想使用dplyr 0.7.0 的新NSE方法,如果这是合适的,但无法弄清楚正确的语法.

Ste*_*mer 7

只有在tidyverse您希望坚持这些包和原则的情况下,才能执行此操作.您可以使用mutate()unite_()来自tidyr包中的任何一个来完成.

运用 mutate()

library(dplyr)
df <- data_frame(a = letters[1:3], b = letters[4:6], c = letters[7:9])
cols_to_concat <- c("a", "b", "c")

df %>% mutate(new_col = do.call(paste0, .[cols_to_concat]))

# A tibble: 3 × 4
      a     b     c new_col
  <chr> <chr> <chr>   <chr>
1     a     d     g     adg
2     b     e     h     beh
3     c     f     i     cfi
Run Code Online (Sandbox Code Playgroud)

运用 unite_()

library(tidyr)
df %>% unite_(col='new_col', cols_to_concat, sep="", remove=FALSE)

# A tibble: 3 × 4
  new_col     a     b     c
*   <chr> <chr> <chr> <chr>
1     adg     a     d     g
2     beh     b     e     h
3     cfi     c     f     i
Run Code Online (Sandbox Code Playgroud)


mt1*_*022 5

您可以尝试symsrlang

library(dplyr)
packageVersion('dplyr')
#[1] ‘0.7.0’
df <- dplyr::data_frame(a = letters[1:3], b = letters[4:6], c = letters[7:9])
cols_to_concat = c("a", "b", "c")

library(rlang)
cols_quo <- syms(cols_to_concat)
df %>% mutate(concat = paste0(!!!cols_quo))

# or
df %>% mutate(concat = paste0(!!!syms(cols_to_concat)))

# # A tibble: 3 x 4
#       a     b     c concat
#   <chr> <chr> <chr>  <chr>
# 1     a     d     g    adg
# 2     b     e     h    beh
# 3     c     f     i    cfi
Run Code Online (Sandbox Code Playgroud)