如何替换列中的所有值,这些值少于3次?假设这是我的专栏(来自数据框):
>df$example
aa
aa
aa
bb
bb
cc
cc
cc
结果应该是(如果我用文本replaced
替换它们):
>df$example
aa
aa
aa
replaced
replaced
cc
cc
cc
我看到了另一个解决方案(using R - delete rows when a value repeated less than 3 times),但这只是删除了行。我也用桌子试了一下。我希望避免使用for循环,因为我会在巨大的数据框架上应用它。
答案 0 :(得分:4)
在基础R中,您可以使用ave
,
with(df, ave(example, example, FUN = function(i) replace(i, length(i) < 3, 'replaced')))
#[1] "aa" "aa" "aa" "replaced" "replaced" "cc" "cc" "cc"
注意:确保您的列设置为as.character()
,即不是因素
答案 1 :(得分:1)
使用table
的基础R中的另一个衬管,我们计算每个列值的出现次数,并将这些值更改为“已替换”,这些值少于3次。
df$example[with(df, example %in% unique(example)[table(example) < 3])] <- "Replaced"
df
# example
#1 aa
#2 aa
#3 aa
#4 Replaced
#5 Replaced
#6 cc
#7 cc
#8 cc
答案 2 :(得分:0)
尝试这么高效。
.overlay('Country')
答案 3 :(得分:0)
df$example[df$example %in% names(which(table(df$example) < 3L))] = "replaced"
我们使用table
来计算df$example
中的匹配项。然后,对于少于三次的那些,我们使用names
得到他们的名字,并使用匹配作为索引将原始向量与"=="
匹配。然后我们为这个子数组赋值"replaced"
。
df$example
是factor
您可以使用as.character
投射,然后使用as.factor
重铸。或者,或者,执行此操作:
levels(df$example) = c(levels(df$example), "replaced")
df$example[df$example%in% names(which(table(df$example) < 3L))] = "replaced"
df$example= factor(df$example)
我们基本上会提前添加新级别"replaced"
,在最后一行中,我们会从因子中删除不存在的标签,从而有效地删除已替换的级别。