谁能告诉我下面编写的代码行做什么?
sapply(X, function(x) sum(is.na(x))) / nrow(airports) * 100
可以理解的是,当应用求和函数但将其保留在矩阵中时,它将丢弃NA
s。
感谢您的帮助。
谢谢
答案 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))
是对NA
中foo
个值进行计数的惯用方式。
在这种情况下,目标是百分比而不是计数,我们可以使用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