Как заполнить уровни отсутствующих факторов в фрейме данных?

#r #dataframe #tidyr

#r #фрейм данных #tidyr

Вопрос:

Давайте представим, что у меня есть что-то вроде этого:

 df <- data.frame(
      PERSON = c("Peter", "Peter", "Marcel" , "Lisa", "Lisa"),        
      FRUIT = c("Apple", "Peach","Apple", "Apple", "Peach" ), 
      A = c(100, 200, 100, 200, 300), 
      B=c(1,2,3,4,5) )
df$PERSON <- as.factor(df$Person)
df$FRUIT <- factor(df$FRUIT, levels = c("Apple", "Peach", "Coconut"))
  

Что приводит к

 str(df): 'data.frame':  5 obs. of  4 variables:
$ PERSON: Factor w/ 3 levels "Lisa","Marcel",..: 3 3 2 1 1
$ FRUIT : Factor w/ 3 levels "Apple","Peach",..: 1 2 1 1 2
$ A     : num  100 200 100 200 300
$ B     : num  1 2 3 4 5
  

Я хочу расширить эти данные, фрейм, чтобы для каждого ЧЕЛОВЕКА присутствовали все уровни ФРУКТОВ, например:

  Person FRUIT   A B
1  Peter Apple 100 1
2  Peter Peach 200 2
3  Peter Coconut 0 0
4 Marcel Apple 100 3
5 Marcel Peach 0 0
6 Marcel Coconut 0 0
7   Lisa Apple 200 4
8   Lisa Peach 300 5
9   Lisa Coconut 0 0
  

Отсутствующие значения для A и B должны быть заполнены 0.

Я пытался tidyr::complete(df$FRUIT, 0) , но, похоже, я неправильно использовал эту функцию.

Комментарии:

1. Исправьте с помощью df$PERSON <- as.factor(df$PERSON)

Ответ №1:

complete Принимает первый аргумент как «данные», за которым следуют столбцы для расширения. По умолчанию значение fill NA, но мы можем изменить его на 0, указав его в a list .

 complete(df, PERSON, FRUIT, fill = list(A=0, B = 0))
  

Комментарии:

1. Это работает, спасибо. Возможно ли также создать список на основе имен столбцов? В реальных условиях количество столбцов, которые должны быть заполнены 0, равно 20. Итак, нужно много вводить

2. @barracuda317 В этом случае попробуйте complete_ , т.е. library(dplyr); complete_(df, names(df)[1:2]) %>% mutate_each(funs(replace(., is.na(.), 0)), A:B)