Я пытаюсь объединить несколько столбцов в вектор (в идеале я хотел бы указать, какие столбцы используют какое-либо регулярное выражение или dplyr::contains()
. В любом случае, я НЕ собираюсь объединять столбцы или решение, используя paste
(я хочу иметь возможность использовать оператор %in%
на результирующем векторе. Я хочу, чтобы новый столбец был вектором значений, который можно было бы аннулировать с помощью unnest_wider
или какой-либо подобной функции. Я уверен, что это возможно, просто пока не могу придумать правильные условия поиска. Это кажется быть рядом, но не работает:
df <- tribble(~A, ~B,
1, 2,
3, 4,
5, 6)
df %>%
mutate(C = I(list(A, B)))
Результат будет выглядеть примерно так
A B C
1 1 2 c(1,2)
2 3 4 c(3,4)
3 5 6 c(5,6)
Здесь мы можем использовать либо 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]>
Или с 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]>
Основываясь на комментариях OP, если мы хотим создать столбец list
только с столбцами, имеющими суффикс _id
names(df) <- paste0(names(df), "_id")
df %>%
rowwise %>%
mutate(C = list(c_across(ends_with("_id")))) %>%
ungroup
-выход
# 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]>
Если подстрока "_id"
находится в начале, измените ends_with
на starts_with
или используйте matches("^_id")
Или с pmap
df %>%
mutate(C = pmap(select(., ends_with("_id")), ~ c(...)))
-выход
# 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]>
Или используя Map
из base R
df$C <- do.call(Map, c(f = c, df[grep("_id", names(df))]))
@LSmeets Если у вас более одной переменной, вы можете использовать pmap
вместо map2
@LSmeets, вы можете проверить обновленное решение
@LSmeets Вы имели в виду prefix
или suffix
? Если это префикс, вы можете сделать starts_with("_id")
или matches("^_id")
Да это работает! Спасибо. чтобы добавить функцию фильтра, просто добавьте %>% rowwise %>% filter(3 %in% C)
к любому из двух вариантов.
Это очень крутые решения! В моем случае мне больше всего понравился метод c_across
, но он медленный с таким гигантским набором данных, как мой (почти 4 миллиона строк). Для тех, кто читает это, у кого есть большой набор данных, вместо этого используйте решение purrr::pmap
; это намного быстрее, потому что не нужно использовать rowwise
.
Спасибо, этот первый вариант работает, есть идеи о том, как добавить команду grepl для выбора переменных, которые необходимо включить (скажем, только столбцы с префиксом «_id»)? второй вариант работает для меня только в том случае, если есть максимум две строки, но я мог бы изучить другие функции purrr.