2017-06-27 70 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>