Можно ли объединить столбцы в одном кадре данных на основе содержимого другого кадра данных? - PullRequest
2 голосов
/ 05 октября 2019

Я столкнулся с, вероятно, очень простой проблемой и застрял. У меня есть фрейм данных (df1) и второй фрейм данных (df2), который я хочу использовать в качестве рецепта для объединения столбцов df1. Имена col в df2 должны быть именами новых столбцов конечного фрейма данных

Я знаю, я могу сделать это напрямую, используя функцию dplyr mutate без df2, но идея в том, что я могу автоматизировать процесс сбудущие изменения в файле группировки.

Это пример фрейма данных

df1 <- data.frame(
  ID = seq(1:5),
  A = c(10,15,20,90,1),
  B = c(10,15,5,10,1),
  C = c(10,15,5,10,1),
  D = c(1,20,34,12,5),
  E = c(2,23,34,12,5)
) 

Это фрейм данных, который я хочу использовать для объединения столбцов df1. Цель состоит в том, чтобы иметь новый фрейм данных, который сохраняет переменную идентификатора df1 и столбцы с Group_1 по Group_3. Например, Group_1 должно быть "df $ B + df $ C"

df2 <- data.frame (
  Group_1 = c("B","C"),
  Group_2 = c("D","A"),
  Group_3 = ("E")
)

Это результат, которого я пытаюсь достичь. Вместо того, чтобы делать это вручную, я хотел бы использовать df2 в качестве рецепта. Надеюсь, кто-нибудь может мне помочь

df3 <- df1 %>%
  select(ID) %>%
  mutate (Group_1 = df1$B + df1$C,
          Group_2 = df1$D + df1$A,
          Group_3 = df1$E )

1 Ответ

0 голосов
/ 05 октября 2019

Вот один из способов использования базы R, где мы зациклим каждый столбец df2, подставим столбцы из df1 и возьмем rowSums, чтобы получить сумму.

cbind(df1[1], sapply(df2, function(x) rowSums(df1[unique(x)])))

#  ID Group_1 Group_2 Group_3
#1  1      20      11       2
#2  2      30      35      23
#3  3      10      54      34
#4  4      20     102      12
#5  5       2       6       5

Аналогичный подход с tidyverse будет

library(dplyr)
library(purrr) 

bind_cols(df1[1], map_df(df2, ~rowSums(df1[unique(.x)])) )

Это после чтения данных в df2 с stringsAsFactors = FALSE.

df2 <- data.frame (
   Group_1 = c("B","C"),
   Group_2 = c("D","A"),
   Group_3 = ("E"), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...