我正在尝试将多个列组合成一个向量(理想情况下,我想使用某些正则表达式或指定哪些列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)
在这里,我们可以使用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_with为starts_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)