给定数据类型的最佳处理方式

时间:2017-06-02 15:40:16

标签: r dataframe na

我正在尝试在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 

1 个答案:

答案 0 :(得分: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)