R добавить 2 кадра данных с разными столбцами - PullRequest
1 голос
/ 14 апреля 2020

Я хотел бы добавить dfToAdd к df, где в первом отсутствуют столбцы. Важной деталью является то, что в df есть два типа столбцов. 1-й набор столбцов коррелирует друг с другом. Например, группа = "A" означает имя = "Группа A" и цвет = "Синий". Не может быть комбинации A-Group A-Red. 2-й тип столбцов коррелирует между собой. animal = "Dog" action = "Bark" И я хотел бы добавить этот второй фрейм данных с отсутствующими столбцами столбцов первого типа. Эти столбцы должны быть заполнены комбинациями столбцов первого типа, например следующего dfResult (порядок строк не имеет значения):

df = data.frame(group = c("A", "A", "A", "B", "B", "B"),
                name = c("Group A", "Group A", "Group A", "Group B", "Group B", "Group B"),
                color = c("Blue", "Blue", "Blue", "Red", "Red", "Red"),
                animal = c("Dog", "Cat", "Mouse", "Dog", "Cat", "Mouse"),
                action = c("Bark", "Meow", "Squeak", "Bark", "Meow", "Squeak")
                )

dfToAdd = data.frame(animal = c("Lion", "Bird"), 
                     action = c("Roar", "Chirp"))

dfResult = data.frame(group = c("A", "A", "A", "B", "B", "B", "A", "A", "B", "B"),
                      name = c("Group A", "Group A", "Group A", "Group B", "Group B", "Group B", "Group A", "Group A", "Group B", "Group B"),
                      color = c("Blue", "Blue", "Blue", "Red", "Red", "Red", "Blue", "Blue", "Red", "Red"),
                      animal = c("Dog", "Cat", "Mouse", "Dog", "Cat", "Mouse", "Lion", "Bird", "Lion", "Bird"),
                      action = c("Bark", "Meow", "Squeak", "Bark", "Meow", "Squeak", "Roar", "Chirp", "Roar", "Chirp"))
> df
  group    name color animal action
1     A Group A  Blue    Dog   Bark
2     A Group A  Blue    Cat   Meow
3     A Group A  Blue  Mouse Squeak
4     B Group B   Red    Dog   Bark
5     B Group B   Red    Cat   Meow
6     B Group B   Red  Mouse Squeak
> dfToAdd
  animal action
1   Lion   Roar
2   Bird  Chirp
> dfResult
   group    name color animal action
1      A Group A  Blue    Dog   Bark
2      A Group A  Blue    Cat   Meow
3      A Group A  Blue  Mouse Squeak
4      B Group B   Red    Dog   Bark
5      B Group B   Red    Cat   Meow
6      B Group B   Red  Mouse Squeak
7      A Group A  Blue   Lion   Roar
8      A Group A  Blue   Bird  Chirp
9      B Group B   Red   Lion   Roar
10     B Group B   Red   Bird  Chirp

Но 1-й тип столбцов (группа, имя, цвет) не совсем известно. Я работаю с несколькими переменными группирования произвольного числа. Вы можете представить, что может быть или не быть столбец описания = «Группа A - хорошая группа» или дата = «2020.04.13». Мы точно знаем только столбцы второго типа: животное и действие.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Мы могли бы сделать это за один %>% путем slice извлечения первой строки из 'df', select столбцов, которые не являются столбцами в 'dfToAdd', связать это с 'dfToAdd', затем связать строку с 'df' и использовать complete

library(dplyr)
library(tidyr)
library(rlang)
library(purrr)
df %>%
       slice(1) %>%
       select(-names(dfToAdd)) %>%  
       uncount(nrow(dfToAdd))  %>%     
       bind_cols(dfToAdd) %>%
       bind_rows(df, .) %>% 
       complete(nesting(!!! syms(names(dfToAdd))), 
             nesting(!!! syms(setdiff(names(.), names(dfToAdd)))))
# A tibble: 10 x 5
#   animal action group name    color
# * <fct>  <fct>  <fct> <fct>   <fct>
# 1 Cat    Meow   A     Group A Blue 
# 2 Cat    Meow   B     Group B Red  
# 3 Dog    Bark   A     Group A Blue 
# 4 Dog    Bark   B     Group B Red  
# 5 Mouse  Squeak A     Group A Blue 
# 6 Mouse  Squeak B     Group B Red  
# 7 Bird   Chirp  A     Group A Blue 
# 8 Bird   Chirp  B     Group B Red  
# 9 Lion   Roar   A     Group A Blue 
#10 Lion   Roar   B     Group B Red  
1 голос
/ 14 апреля 2020

Когда я писал это, у меня была идея использовать [nesting][1] по обе стороны от функции [complete][2] тидира и обнаруживать пропущенные столбцы вручную (возможно, есть более элегантное решение):

# First find all grouping columns
groupCols = colnames(df)[!(colnames(df) %in% colnames(dfToAdd))]
otherCols = colnames(df)[colnames(df) %in% colnames(dfToAdd)]
# Populate missing columns with first grouping appearing in the df
dfToAdd[groupCols] = df[1, groupCols]
# rbind it to append
dfResult = rbind(df, dfToAdd)
# Now we have obvious missing combinations, tidyr::complete accepts nesting information to generate combinations only for those, which needs to be different.
dfResult %>% tidyr::complete(tidyr::nesting(!!! syms(otherCols)), tidyr::nesting(!!! syms(groupCols)))

edit : на самом деле понял, что я использую неизвестные имена столбцов в конце. Это не работает на самом деле. Мне нужно передать groupCols (символьный вектор) на второй вызов вложенности.

edit2: теперь, благодаря ответу akrun, я тоже могу исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...