我是R的新手,我正在努力改进编写尽可能高效/漂亮的代码。
我的任务是: 检查"年龄"的缺失值和"姓名"数据集train.csv。
的属性我想在单独的列表元素中为每列生成缺失值的索引。我编写了以下代码来执行此操作。
list(which(is.na(train$Age)))
list(which(is.na(train$Name)))
我的直觉告诉我,如果你很多人都在编写同一行代码的几次迭代,那么你可能不太了解这种语言(任何反对意见?)。我能够使用" apply"来压缩上面的内容,但是这个函数在所有列上运行,而不仅仅是在两个感兴趣的列上运行。
apply(train, 2, function(x) which(is.na(x)))
或者,我可以用这两列创建一个新的数据框,但这完全违背了这个问题的目的......
非常感谢任何提示!
答案 0 :(得分:0)
要仅对感兴趣的列运行您的应用,您可以更改
apply(train[,c("Age", "Name")], 2, function(x) which(is.na(x)))
到
train[,c("Age", "Name")]
额外说明:train
从<{1}}开始所有行(,
之前没有),只列“年龄”和“姓名”(要在,
之后保留的列列表
答案 1 :(得分: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>