在循环中使用 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
数据集,其中包含数据框中 color
和 group
的每个组合。如果您不指定 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
我在正确编码循环以向小型数据集添加行时遇到问题。
假设我有以下名为 "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
数据集,其中包含数据框中 color
和 group
的每个组合。如果您不指定 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