【问题标题】:replace multiple values in data.table with R用 R 替换 data.table 中的多个值
【发布时间】:2021-08-21 13:56:20
【问题描述】:

我尝试了多种方法将数据表中的两个值替换为 NA。

数据为here。有两个值 92233720368547758072147483647 我打算用 NA 替换它们

library(data.table)

data <- fread("https://raw.githubusercontent.com/Deborah-Jia/Complete_Analysis_da2/main/eg1.csv", integer64 = "numeric")

我试过了:

data[data = 9223372036854775807|2147483647]

有错误:

[.data.table(data, , data = 9223372036854775808 | 2147483647, 中的错误: 未使用的参数(数据 = 9223372036854775808 | 2147483647)

我检查了 [i, j, by...] 的结构,但找不到原因。所以,我改用 for 循环:

# only these cols have 9223372036854775807 and 2147483647
special_col <- data %>% select(matches("price|size|room")) %>% colnames()

for ( icol in special_col) {
  data[icol == 9223372036854775807|2147483647, icol := NA] 
}

它没有按预期工作;我仍然可以在数据表中找到2147483647

我知道我可以使用

data[total_room_count_high == 9223372036854775807|2147483647, total_room_count_high := NA] 

并且复制每一列,但是比较麻烦。

在这些方法之前,我还做了acrossfilter_atmapply 结合function 来处理每一列。但是只要我把col放在data[ ]里面,那么data.table就会认为col是一个列名,而不是代表所有列的变量。

【问题讨论】:

    标签: r for-loop replace data.table


    【解决方案1】:

    为了比较,您应该使用==。您可以使用| 作为-

    data <- read.csv2("https://raw.githubusercontent.com/Deborah-Jia/Complete_Analysis_da2/main/eg1.csv")
    data[data == 2147483647 | data == 9223372036854775807] <- NA
    data
    

    【讨论】:

      【解决方案2】:

      一种使用set的方法

      values <- c(9223372036854775807, 2147483647)
      for(col in names(data)) set(data, i = which(data[[col]] %in% values), j = col, value = NA_integer_)
      

      【讨论】:

        【解决方案3】:

        请注意,9223372036854775807 在您的数据中并不是“真正”,而是 integer64 有时表示 NA 的方式。

        您可以只替换整数列。

        data <- fread("https://raw.githubusercontent.com/Deborah-Jia/Complete_Analysis_da2/main/eg1.csv", integer64 = "numeric")
        for (j in seq_along(data)) {
          vj <- .subset2(data, j)
          if (is.integer(vj)) {
            i <- which(vj == .Machine$integer.max)
            set(data, i = i, j = j, value = NA_integer_)
          }
        }
        
        

        请注意,2147483647 可能会使用整数表示“正无穷大”,因此可能比NA 更好。 (例如,如果您要过滤高于某个价格的所有属性,如果将这些值替换为NA,这些属性将被错误过滤)。

        【讨论】:

          猜你喜欢
          • 2016-08-26
          • 1970-01-01
          • 2014-05-14
          • 2013-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-08
          • 1970-01-01
          相关资源
          最近更新 更多