我有一个产品编号类别,它有许多不同的值和每个值的行。
示例如下
282行A1,23行A3,1行y7,3行x56。
我正在尝试运行for循环,将5行以下产品的标签更改为"other“。我现在拥有的代码是:
for (i in unique(color$Fabric)){
if (length(color$Fabric[color$Fabric == i]) < 5){
color$Fabric[i] <- 'Other'
}
}然而,我一直收到这个错误:
Error in `$<-.data.frame`(`*tmp*`, "Fabric", value = c("Other", "Other", :
replacement has 4470 rows, data has 4469我也尝试过:
for (i in unique(color$Fabric)){
if (length(color$Fabric[color$Fabric == i]) > 5){
color$FabricNew[i] <- i
} else {
color$FabricNew[i] <- "Other"
}
}我得到了同样的错误。
我知道这是通过树的语法错误,但我有点卡住了。
谢谢!
发布于 2021-01-30 07:54:59
循环是在Fabric值上进行的,并且它不是‘unique’的索引。我们可以通过使用table来获取“Fabric”中每个唯一元素的频率计数,然后将那些计数小于5的元素子集,在“Fabric”上使用%in%创建一个逻辑向量,并将这些元素分配给“Other”,从而更容易地做到这一点。
tbl1 <- table(color$Fabric)
color$FabricNew <- color$Fabric
color$FabricNew[color$Fabric %in% names(tbl1)[tbl1 <= 5]] <- "Other"在OP的代码中,如果我们将其更改为
un1 <- unique(color$Fabric)
color$FabricNew <- color$Fabric
for(i in seq_along(un1)) {
i1 <- color$Fabric == un1[i]
if(sum(i1) <= 5) {
color$FabricNew[i1] <- 'Other'
}
}发布于 2021-01-30 13:03:53
这似乎是fct_lump_min的一个很好的用例,它会自动为你做这件事。
df <- data.frame(col = factor(rep(letters[1:4], c(10, 2, 13, 4))))
table(df$col)
# a b c d
#10 2 13 4 现在,让我们保留仅出现5次的值,并将其余的值转换为'Other'。
df$col <- forcats::fct_lump_min(df$col, 5)
table(df$col)
# a c Other
# 10 13 6 https://stackoverflow.com/questions/65963230
复制相似问题