在循环中使用 rbind 添加 0 值

Using rbind to add 0 values during a loop

我在正确编码循环以向小型数据集添加行时遇到问题。

假设我有以下名为 "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))

这个函数returns是整个数据集重复,最后只有两个归零值之一。我明白为什么这是一个错误,我相信解决方案很简单,但我不知道如何纠正它。有什么建议吗?

谢谢!

A.

使用 tidyr::complete() :

complete(data = df, 
         color = levels(color), group = levels(group), 
         fill = list(count = 0))
tidyr::complete(yourcolorsdataframe, color, group, fill = list(count = 0))

tidyverse 解决方案创建了一个 complete 数据集,其中包含数据框中 colorgroup 的每个组合。如果您不指定 fill=,默认值将用 NA 值填充 count。使用命名列表 list(count = 0) 告诉 tidyr 用零填充。

使用基数 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