paste()ing 名称存储在变量中的列

paste()ing columns whose names are stored in a variable

如何根据名称包含在字符向量中的列创建新列?

鉴于这两个变量:

data <- tibble(numbers = 1:10, letters = letters[1:10])
columns <- c("numbers","letters")

什么命令会产生这个输出?

# A tibble: 10 x 3
   numbers letters combined
     <int> <chr>   <chr>   
 1       1 a       1-a     
 2       2 b       2-b     
 3       3 c       3-c     
 4       4 d       4-d     
 5       5 e       5-e     
 6       6 f       6-f     
 7       7 g       7-g     
 8       8 h       8-h     
 9       9 i       9-i     
10      10 j       10-j  

我的第一个想法是 mutate(data, combined = paste(!!columns, sep = "-")) 但这行不通。

Error: Problem with `mutate()` input `combined`.
x Input `combined` can't be recycled to size 10.
ℹ Input `combined` is `paste(c("numbers", "letters"))`.
ℹ Input `combined` must be size 10 or 1, not 2.

不是最漂亮的,但这个应该可以

do.call(
  paste,
  c(data[, columns], list(sep = '-'))
)

tidyverse 方法是使用 unite,您可以将 columns 向量直接传递到函数中,而不必使用 !!.

library(tidyverse)

data %>% 
  tidyr::unite("combined", columns, sep = "-", remove = FALSE) %>% 
  dplyr::relocate(combined, .after = tidyselect::last_col())

输出

   numbers letters combined
     <int> <chr>   <chr>   
 1       1 a       1-a     
 2       2 b       2-b     
 3       3 c       3-c     
 4       4 d       4-d     
 5       5 e       5-e     
 6       6 f       6-f     
 7       7 g       7-g     
 8       8 h       8-h     
 9       9 i       9-i     
10      10 j       10-j 
 cbind( data , combined = paste( data[[ columns[1] ]], data[[ columns[2] ]], sep=“-“)