Использование rbind для добавления 0 значений во время цикла - PullRequest
1 голос
/ 12 февраля 2020

У меня проблемы с кодированием al oop для правильного добавления строк в небольшой набор данных.

Скажем, у меня есть следующий фрейм данных под названием "colors":

color   count   group
Blue      3       1
Blue      2       2
Red       2       2
Green     1       1

Что теперь Мне нужно добавить 0 значений для каждого столбца, чтобы все группы имели каждый цвет, иначе он должен выглядеть следующим образом:

color   count   group
Blue      3       1
Blue      2       2
Red       2       2
Green     1       1
Red       0       1 
Green     0       2

То, что я пытался сделать, подошло ближе к решению, которое я хочу, это:

color.u <- unique(colors$color)

color.z<- function(x){
  if(x %in% colors$color[colors$group == "1"] == F ) {
    rbind(colors, c(x, 0, "1"))
    }
if(x %in% colors$color[colors$group == "2"] == F ) {
    rbind(colors, c(x, 0, "2"))
    }
}

sapply(color.u, function(x) color.z(x))

Эта функция возвращает весь набор данных несколько раз с одним из двух обнуленных значений в конце. Я понимаю, почему это ошибка, и я уверен, что решение легко, но я не знаю, как его исправить. Есть предложения?

Спасибо!

A.

Ответы [ 3 ]

6 голосов
/ 12 февраля 2020

Использование tidyr::complete():

complete(data = df, 
         color = levels(color), group = levels(group), 
         fill = list(count = 0))
3 голосов
/ 12 февраля 2020

Использование базы R

df1 <- structure(list(color = c("Blue", "Blue", "Red", "Green"),
                      count = c(3, 2, 2, 1),
                      group = c(1L, 2L, 2L, 1L)),
                 row.names = c(NA, -4L),
                 class = "data.frame")

df2 <- expand.grid(color = unique(df1$color), group = unique(df1$group))
df2 <- merge(df2, df1, all = TRUE)
df2$count[is.na(df2$count)] <- 0

  color group count
1  Blue     1     3
2  Blue     2     2
3   Red     1     0
4   Red     2     2
5 Green     1     1
6 Green     2     0
3 голосов
/ 12 февраля 2020
tidyr::complete(yourcolorsdataframe, color, group, fill = list(count = 0))

Это решение tidyverse создает набор данных complete с каждой комбинацией color и group в вашем фрейме данных. Если вы не укажете fill=, значение по умолчанию заполнит count значениями NA. Использование именованного списка list(count = 0) говорит tidyr заполнить нулями вместо этого.

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