2017-03-19 30 views
0

我是R的新手,正在研究我的第一個數據集,因此也提出了這些問題。如果它非常基本,我的道歉。R最常見的因素(是/否)

我有一個數據框(Df)與幾列(一些整數,一些因素和幾個文本)。

因子變量(例如:f1)都有True/False/NA值。我試圖用最頻繁的值替換缺失的值。

我知道每個這些因子變量的最頻繁的值。我發現他們使用summary(Df)。但是,不想要硬編碼或使用太多的代碼行。我來自數據庫背景,我將數據框可視化爲一個表格,並將此因素變量視爲一列。也許這就是我的問題!

以下是我試過的選項,以及爲什麼它沒有工作:

  1. Df$f1[is.na(Df$D1)] <- median(as.numeric(levels(Df$f1)),na.rm=TRUE)

這沒有工作,因爲它拋出一個warning : NAs introduced by coercion

  1. 我試圖使用as.numeric將因子轉換爲數字,並找到中位數和重新編碼。但它將大部分轉換爲NA s。

請幫忙!

回答

0

如果colnums是要更改NA值的因子變量的列號向量,則可以使用以下內容。如果你想改變這一切的因素,只是用

colnums <- which(sapply(df,is.factor))

NA2mf <- function(col.num, df){ 
    col <- df[,col.num] 
    tab <- table(col) 
    max <- which.max(tab) 
    if(sum(tab == tab[max]) > 1) { 
     warning(paste('no unique most frequent factor in var', as.character(names(df)[col.num]))) 
    } 
    col[is.na(col)] <- names(max) 
    col 
} 

df[,colnums] <- sapply(colnums, NA2mf, df = Df) 
0

與少的代碼另一種選擇:

dt = data.frame(x = sample(c(letters[1:5],NA),50,replace=TRUE)) 

for(field in names(dt)){ 
    dt[is.na(dt[,field]),field] <- names(sort(table(dt$x),TRUE)[1])   
} 

併爲稍後在R'ing,還有更多優雅的方式來實現這個與真棒data.table包。