2017-06-02 57 views
1

我想重新分类在R的数据框中的NA。我希望他们是一个vlaue,如果他们是字符值或因素,另一个如果他们是数字或整数。我想出了如下陈述,但由于某种原因,我要离开了。什么是最好的方法来做到这一点?最好的方式来处理指定数据类型的NAs

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 
+0

我认为与'is.na'的任务是不正确的。检查'v1 < - c(1,2,NA,3); is.na(v1)< - 5'您可能需要'df_eng [,i] [is.na(df_eng [,i])] < - 10219300' – akrun

回答

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)

+1

谢谢!这是很好的反馈 – mangodreamz

相关问题