替换列中出现少于x次的值

时间:2018-01-30 14:55:41

标签: r dataframe

如何替换列中的所有值,这些值少于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循环,因为我会在巨大的数据框架上应用它。

4 个答案:

答案 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$examplefactor

您可以使用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",在最后一行中,我们会从因子中删除不存在的标签,从而有效地删除已替换的级别。