gpt4 book ai didi

r - 修复由 9s (ex : 99, 999, 9999) 表示的 NA 匹配 data.table(或 fread)中的列宽

转载 作者:行者123 更新时间:2023-12-04 09:35:07 25 4
gpt4 key购买 nike

文本文件中的数据通常具有代表 NA 的 9 的可变长度序列。也就是说,代表 NA 的 9 的数量取决于每个变量中的字符数。例如:

  • 2 位状态代码将有 99 个代表 NA
  • 一个 3 位变量将有 999 个代表 NA。请注意,在这种情况下,99 可能是合法(非 NA)值。

  • 清理这些值的最佳方法是什么?
    请注意,在 fread , na.values=c('99','999')不是一个理想的选择,因为它会破坏 3 位变量中的合法 99 值。
    假设我有 data.table d , 和两组数字列
    cols_2digit <- c('a','b')
    cols_3digit <- c('c','d')
    如何一次在每组的所有列中用 NA 替换 9 的序列?组数有限,每组一个命令即可。
    OBS:这些可变长度的 NA 代码让人联想到固定宽度的文件 (fwf),即使在 csv 中提供了现代文件(对于跨列的 NA 可能采用标准的“999999”值)。

    最佳答案

    我们可以使用 set通过循环在 'cols_2digit' 或 'cols_3digit' 中指定的列并在适当的位置更改列中的值

    for(j in cols_2digit) set(d, i = which(d[[j]] == '99'), j = j, value = NA_character_)
    for(j in cols_3digit) set(d, i = which(d[[j]] == '999'), j = j, value = NA_character_)

    或者另一个选项是 Map
    d[, c(cols_2digit, col2_3digit) := 
    Map(function(dat, y) lapply(dat, function(x)
    fifelse(x, x == y, NA_character_)), list(.SD[, ..cols_2digit],
    .SD[, ..cols_3digit]), list('99', '999')) ]

    此外,不是在不同的集合上这样做,另一种选择是根据最大频率找到列宽
    Mode <- function(x) {
    ux <- unique(x)
    ux[which.max(tabulate(match(x, ux)))]
    }

    d[, lapply(.SD, function(x) {
    # get the most frequent column width
    colwidth <- Mode(nchar(x))
    # if it is max
    # colwidth <- max(nchar(x))
    # get the elements that are only 9 from start (`^`) to end (`$`)
    i1 <- grepl('^9+$', x)
    # do the assignment based on the index
    x[i1][nchar(x[i1]) == colwidth] <- NA_character_
    x
    })]

    关于r - 修复由 9s (ex : 99, 999, 9999) 表示的 NA 匹配 data.table(或 fread)中的列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628905/

    25 4 0