在R中将is.na与Sapply函数一起使用

时间:2018-11-12 21:30:40

标签: r lapply na sapply

谁能告诉我下面编写的代码行做什么?

sapply(X, function(x) sum(is.na(x))) / nrow(airports) * 100

可以理解的是,当应用求和函数但将其保留在矩阵中时,它将丢弃NA s。

感谢您的帮助。

谢谢

1 个答案:

答案 0 :(得分:3)

足够的评论,需要时间回答:

sapply(X,      # apply to each item of X (each column, if X is a data frame)
  function(x)  # this function:
    sum(is.na(x))  # count the NAs
) / nrow(airports) * 100  # then divide the result by the number of rows in the the airports object
  # and multiply by 100

换句话说,它计算X的每一列中缺失值的数量,然后将结果除以airports中的行数,然后乘以100。计算其中的缺失值的百分比假设X的行数与airports相同。

X的列与nrow(airports)混合并匹配很奇怪,我希望它们是相同的(即sapply(airports, ...) / nrow(airports)sapply(X, ...) / nrow(X)

正如我在评论中提到的,没有任何东西被“丢弃”。如果您想忽略所有sum值而进行NA,则需要sum(foo, na.rm = TRUE)。取而代之的是,这里*被求和的是is.na(x),也就是说,我们正在求和每个值是否缺失:计算缺失值。 sum(is.na(foo))是对NAfoo个值进行计数的惯用方式。

在这种情况下,目标是百分比而不是计数,我们可以使用mean()而不是sum() / n来简化:

# slightly simpler, consistent object
sapply(airports, function(x) mean(is.na(x))) * 100

我们还可以在整个数据上使用is.na(),因此我们不需要“匿名函数”:

# rearrange for more simplicity
sapply(is.na(airports), mean) * 100