Объединить несколько столбцов в R в новый векторный столбец (предпочтительно решение tidyr)

Я пытаюсь объединить несколько столбцов в вектор (в идеале я хотел бы указать, какие столбцы используют какое-либо регулярное выражение или 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)
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 247
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь мы можем использовать либо 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))]))

Спасибо, этот первый вариант работает, есть идеи о том, как добавить команду grepl для выбора переменных, которые необходимо включить (скажем, только столбцы с префиксом «_id»)? второй вариант работает для меня только в том случае, если есть максимум две строки, но я мог бы изучить другие функции purrr.

L Smeets 20.12.2020 19:56

@LSmeets Если у вас более одной переменной, вы можете использовать pmap вместо map2

akrun 20.12.2020 19:58

@LSmeets, вы можете проверить обновленное решение

akrun 20.12.2020 20:03

@LSmeets Вы имели в виду prefix или suffix? Если это префикс, вы можете сделать starts_with("_id") или matches("^_id")

akrun 20.12.2020 20:11

Да это работает! Спасибо. чтобы добавить функцию фильтра, просто добавьте %>% rowwise %>% filter(3 %in% C) к любому из двух вариантов.

L Smeets 20.12.2020 22:32

Это очень крутые решения! В моем случае мне больше всего понравился метод c_across, но он медленный с таким гигантским набором данных, как мой (почти 4 миллиона строк). Для тех, кто читает это, у кого есть большой набор данных, вместо этого используйте решение purrr::pmap; это намного быстрее, потому что не нужно использовать rowwise.

Bajcz 03.03.2022 18:41

Другие вопросы по теме