【问题标题】:Replacing values in column that occur less than x times替换列中出现少于 x 次的值
【发布时间】:2018-01-30 14:55:40
【问题描述】:

如何替换列中出现少于 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 循环,因为我会将它应用到一个巨大的数据帧上。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    在基础 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(),即不考虑

    【讨论】:

      【解决方案2】:

      在基础 R 中使用table 的另一个衬里,我们计算每个列值的出现次数并将这些值更改为出现少于 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
      

      【讨论】:

        【解决方案3】:

        试试这个效率更高。

        setDT(df)
        df[df$example==names(which(table(df$example) < 3)),example:="replaced"]
        

        【讨论】:

          【解决方案4】:
          df$example[df$example %in% names(which(table(df$example) < 3L))] = "replaced"
          

          说明

          我们使用table 来计算df$example 中出现的次数。然后,对于出现次数少于 3 次的那些,我们用 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",在最后一行我们从因子中删除了不存在的标签,有效地删除了替换的级别。

          【讨论】:

            猜你喜欢
            • 2021-01-01
            • 1970-01-01
            • 2022-10-07
            • 1970-01-01
            • 1970-01-01
            • 2015-03-27
            • 2021-04-10
            • 2011-08-27
            • 1970-01-01
            相关资源
            最近更新 更多