将 R 中的多个列组合成一个新的向量列(最好是 tidyr 解决方案)

L S*_*ets 2 r dplyr tidyr

我正在尝试将多个列组合成一个向量(理想情况下,我想使用某些正则表达式或指定哪些列dplyr::contains()。无论如何,我不希望使用paste(我希望能够%in%在结果上使用语句来连接列或解决方案)向量。我希望新列是一个值向量,可以使用unnest_wider或一些类似的函数来取消嵌套。我确信这是可能的,只是现在想不出正确的搜索词。这似乎很接近,但不起作用:

df <- tribble(~A, ~B,
               1, 2, 
               3, 4, 
               5, 6)

df %>%
    mutate(C = I(list(A, B)))
Run Code Online (Sandbox Code Playgroud)

结果看起来像这样

      A     B    C
1     1     2   c(1,2)
2     3     4   c(3,4)
3     5     6   c(5,6)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

在这里,我们可以使用rowwise

library(dplyr)
df %>%
   rowwise %>%
   mutate(C = list(c(A, B))) %>%
   ungroup
# A tibble: 3 x 3
#      A     B C        
#  <dbl> <dbl> <list>   
#1     1     2 <dbl [2]>
#2     3     4 <dbl [2]>
#3     5     6 <dbl [2]>
Run Code Online (Sandbox Code Playgroud)

或者map2默认返回一个list. 在这里,我们循环遍历“A”、“B”的相应元素,并连接 ( c)

library(dplyr)
library(purrr)
df %>%
   mutate(C = map2(A, B, c))
# A tibble: 3 x 3
#      A     B C        
#   <dbl> <dbl> <list>   
#1     1     2 <dbl [2]>
#2     3     4 <dbl [2]>
#3     5     6 <dbl [2]>
Run Code Online (Sandbox Code Playgroud)

更新

根据OP的评论,如果我们想创建一个list仅包含具有后缀的列的列_id

names(df) <- paste0(names(df), "_id")
df %>%
    rowwise %>%
    mutate(C = list(c_across(ends_with("_id")))) %>%
    ungroup
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 3 x 3
#   A_id  B_id C        
#  <dbl> <dbl> <list>   
#1     1     2 <dbl [2]>
#2     3     4 <dbl [2]>
#3     5     6 <dbl [2]>
Run Code Online (Sandbox Code Playgroud)

如果子字符串"_id"位于开头,则将其更改ends_withstarts_with或使用matches("^_id")

或者与pmap

df %>%
     mutate(C = pmap(select(., ends_with("_id")), ~ c(...)))
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 3 x 3
#   A_id  B_id C        
#  <dbl> <dbl> <list>   
#1     1     2 <dbl [2]>
#2     3     4 <dbl [2]>
#3     5     6 <dbl [2]>
Run Code Online (Sandbox Code Playgroud)

或者使用Map来自base R

df$C <-  do.call(Map, c(f = c, df[grep("_id", names(df))]))
Run Code Online (Sandbox Code Playgroud)