首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在特定长度下转换r中的列?

如何在特定长度下转换r中的列?
EN

Stack Overflow用户
提问于 2021-01-30 07:51:36
回答 2查看 17关注 0票数 0

我有一个产品编号类别,它有许多不同的值和每个值的行。

示例如下

282行A1,23行A3,1行y7,3行x56。

我正在尝试运行for循环,将5行以下产品的标签更改为"other“。我现在拥有的代码是:

代码语言:javascript
复制
for (i in unique(color$Fabric)){
  if (length(color$Fabric[color$Fabric == i]) < 5){
      color$Fabric[i] <- 'Other'
  }
}

然而,我一直收到这个错误:

代码语言:javascript
复制
Error in `$<-.data.frame`(`*tmp*`, "Fabric", value = c("Other", "Other",  : 
  replacement has 4470 rows, data has 4469

我也尝试过:

代码语言:javascript
复制
for (i in unique(color$Fabric)){
  if (length(color$Fabric[color$Fabric == i]) > 5){
      color$FabricNew[i] <- i
  } else {
    color$FabricNew[i] <- "Other"
  }
}

我得到了同样的错误。

我知道这是通过树的语法错误,但我有点卡住了。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-01-30 07:54:59

循环是在Fabric值上进行的,并且它不是‘unique’的索引。我们可以通过使用table来获取“Fabric”中每个唯一元素的频率计数,然后将那些计数小于5的元素子集,在“Fabric”上使用%in%创建一个逻辑向量,并将这些元素分配给“Other”,从而更容易地做到这一点。

代码语言:javascript
复制
tbl1 <- table(color$Fabric)
color$FabricNew <- color$Fabric
color$FabricNew[color$Fabric %in% names(tbl1)[tbl1 <= 5]] <- "Other"

在OP的代码中,如果我们将其更改为

代码语言:javascript
复制
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'
    }
 }
票数 1
EN

Stack Overflow用户

发布于 2021-01-30 13:03:53

这似乎是fct_lump_min的一个很好的用例,它会自动为你做这件事。

代码语言:javascript
复制
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'

代码语言:javascript
复制
df$col <- forcats::fct_lump_min(df$col, 5)

table(df$col)
#    a     c Other 
#   10    13     6 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65963230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档