2017-06-02 92 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

相關問題