【问题标题】:Impute most frequent categorical value in all columns in data frame在数据框中的所有列中估算最常见的分类值
【发布时间】:2016-07-22 12:40:54
【问题描述】:

我有以下虚拟数据框:

col1 = c("aa", NA, NA, NA, NA, NA, NA
        , "cc", "cc", "cc", "cc", "cc", "cc", "cc", "cc", "cc"
        , "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa")
col2 = c("aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa"
         , NA, NA, NA, NA, NA, NA, NA, NA, NA
         , "bb", "bb", "bb", "bb", "bb", "bb", "bb", "bb", "bb")
col3 = c("aa", "bb", "bb"
         , NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
         , NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
col4 = c(NA, NA, NA, 4:27)
col5 = c(28:51, NA, NA, NA)

# Construct the data frame with NAs in categorical and numeric columns
df = data.frame("col1" = col1, "col2" = col2, "col3" = col3
                , "col4" = col4, "col5" = col5, stringsAsFactors = FALSE)

我想了解如何使用简单的规则编写一个函数来仅估算 分类 值,即col1, col2, col3

  1. 将分类NA 列值与该列中最常见的值进行估算
  2. 如果出现平局,请选择按字母顺序排列的第一个值,即aa 优先于bb(在col2 的情况下)

任何人都可以协助编写一个函数,该函数将df 作为输入并仅返回分类值的插补数据框。 col4, col5 应该保持不变(它们有 NA,但是是数字,所以应该被忽略)。

澄清 对于这个例子:

  1. col1 NA 应该被推算为 "aa"
  2. col2 NAs 应该被推算为"aa"(按字母顺序排列)
  3. col3 NA 应该被推算为 "bb"

谢谢

【问题讨论】:

  • 到目前为止你的努力是什么?
  • @G.Cocca - 到目前为止我有以下内容:tt <- table(df$col1) names(tt[which.max(tt)]) 获得最大值。不确定如何有效地将 cols 分类为分类然后替换 NA。这是基于stackoverflow.com/questions/18433647/…

标签: r


【解决方案1】:

我们可以为非数字列创建索引

i1 <- !sapply(df, is.numeric)

为 Mode 创建一个函数

Mode <- function(x) { 
      ux <- sort(unique(x))
      ux[which.max(tabulate(match(x, ux)))] 
}

replacecharacter 列中出现频率最高的 NA

df[i1] <- lapply(df[i1], function(x)
              replace(x, is.na(x), Mode(x[!is.na(x)])))

【讨论】:

    【解决方案2】:

    你可以使用这个解决方案:

    df[, sapply(df, function(x) !is.numeric(x))] <- apply(df[, sapply(df, function(x) !is.numeric(x))], 2, function(x) {x[is.na(x)] <- names(sort(table(x), decreasing = TRUE)[1]); x})
       col1 col2 col3 col4 col5
    1    aa   aa   aa   NA   28
    2    aa   aa   bb   NA   29
    3    aa   aa   bb   NA   30
    4    aa   aa   bb    4   31
    5    aa   aa   bb    5   32
    6    aa   aa   bb    6   33
    7    aa   aa   bb    7   34
    8    cc   aa   bb    8   35
    9    cc   aa   bb    9   36
    10   cc   aa   bb   10   37
    11   cc   aa   bb   11   38
    12   cc   aa   bb   12   39
    13   cc   aa   bb   13   40
    14   cc   aa   bb   14   41
    15   cc   aa   bb   15   42
    16   cc   aa   bb   16   43
    17   aa   aa   bb   17   44
    18   aa   aa   bb   18   45
    19   aa   bb   bb   19   46
    20   aa   bb   bb   20   47
    21   aa   bb   bb   21   48
    22   aa   bb   bb   22   49
    23   aa   bb   bb   23   50
    24   aa   bb   bb   24   51
    25   aa   bb   bb   25   NA
    26   aa   bb   bb   26   NA
    27   aa   bb   bb   27   NA
    

    【讨论】:

    • 谢谢。只是为了我的理解,哪个部分检查分类与数字?
    • 哎呀...对不起,我没有包括那个。我会编辑。我刚拿了前 3 列。
    • 已编辑:sapply(df, function(x) !is.numeric(x)) 检查非数字列并允许仅对这些列进行子集化。如果你明确想要字符列,你可以将条件从!is.numeric()修改为is.character()
    猜你喜欢
    • 1970-01-01
    • 2021-01-04
    • 2017-06-07
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多