【问题标题】:Best way to handle NAs given data type处理给定数据类型的 NA 的最佳方法
【发布时间】:2017-06-02 15:40:15
【问题描述】:

我正在尝试在 R 的数据框中重新分类 NA。如果它们是字符值或因子,我希望它们是一个值,如果它们是数字或整数,我希望它们是另一个值。我想出了以下 if 语句,但由于某种原因,我离开了。最好的方法是什么?

for(i in ncol(df_eng)) {
  if(class(df_eng[,i]) == "integer") {
    is.na(df_eng[,i]) <- 10219300
  }
  else if(class(df_eng[,i]) == "numeric") {
    is.na(df_eng[,i]) <- 10219300
  }
  else {
    is.na(df_eng[,i]) <- "ABCDEF"
  }
}

 Error in `[<-.data.frame`(`*tmp*`, , i, value = c("2017-05-26 18:20:20",  : 
  replacement has 791 rows, data has 790 

【问题讨论】:

  • 我认为is.na 的分配不正确。检查 ` v1 df_eng[,i][is.na(df_eng[,i])] <- 10219300

标签: r dataframe na


【解决方案1】:

有两个问题。一是is.na 的赋值错误。假设,我们有一个带有一些 NA 值的向量

v1 <- c(1, 2, NA, 3)

按照 OP 的帖子进行分配

is.na(v1) <- 5
v1
#[1]  1  2 NA  3 NA

这会在位置 5 处分配一个 NA 元素,类似

is.na(v1) <- 10
v1
#[1]  1  2 NA  3 NA NA NA NA NA NA

如果预期的行为是将 NA 元素替换为某个值,例如 5

v2 <- c(1, 2, NA, 3)
v2[is.na(v2)] <- 5
v2
#[1] 1 2 5 3

其次,循环只在最后一列循环,即ncol(df_eng)


对 OP 的示例代码应用相同的逻辑

for(i in seq_len(ncol(df_eng))) {
  if(class(df_eng[,i]) == "integer") {
      df_eng[,i][is.na(df_eng[,i])] <- 10219300
 }  else if(class(df_eng[,i]) == "numeric") {
      df_eng[,i][is.na(df_eng[,i])] <- 10219300
   }  else {
     df_eng[,i][is.na(df_eng[,i])] <- "ABCDEF"
   }
  }

另外,请注意循环卡在ncol(df_eng)。它应该是1:ncol(df_eng) 或更正确的seq_len(ncol(df_eng)),如果是data.frame,那么seq_along(df_eng)

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2013-04-17
    • 2016-09-28
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多