2017-06-27 116 views
0

我對R非常陌生,正在努力改進編寫儘可能高效/美觀的代碼。寫列表r函數在數據幀列上迭代

我的任務如下: 檢查數據集train.csv的「年齡」和「名稱」屬性的缺失值。

我想爲單獨的列表元素中的每列產生缺失值的索引。我寫了下面的代碼來做到這一點。

list(which(is.na(train$Age))) 
list(which(is.na(train$Name))) 

我的直覺告訴我,如果你有很多寫同一行代碼的多次迭代,你可能不知道的語言很好(任何異議?)。我可以使用「應用」來濃縮上面的內容,但是此功能在全部列上運行,而不是專門針對這兩種情況。

apply(train, 2, function(x) which(is.na(x))) 

我,或者,創建只是這兩列一個新的數據幀,但擊敗了這個問題完全的目的...

在此先感謝非常的任何指針!

回答

0

爲了運行你唯一感興趣的列應用,你可以改變

apply(train, 2, function(x) which(is.na(x))) 

apply(train[,c("Age", "Name")], 2, function(x) which(is.na(x))) 

額外的解釋:train[,c("Age", "Name")]需要所有行從train(無前,)以及只有列「年齡」和「名稱」(在,之後保留的列的列表)

+0

非常感謝! – StaticNomad

0

要創建一個功能,你可以用你的發言,並修改如下:

train <- data.frame(Age = c(NA,"x100",NA), Name = c("b","c",NA)) 

my.is.na <- function(data.colname){ 
    apply(train[names(train) == data.colname], 2, function(x) which(is.na(x))) 
} 

然後,你可以通過你的數據集的變量名只是調用該函數。

> my.is.na("Name") 
Name 
    3 
> my.is.na("Age") 
    Age 
[1,] 1 
[2,] 3 

數據:

> train 
    Age Name 
1 <NA> b 
2 x100 c 
3 <NA> <NA>