【问题标题】:Using is.na with Sapply function in R在 R 中使用 is.na 和 Sapply 函数
【发布时间】:2018-11-12 21:30:40
【问题描述】:

谁能告诉我下面这行代码是做什么的?

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

可以理解的是,当它应用 sum 函数但将它们保留在矩阵中时,它会丢弃 NAs。

感谢任何帮助。

谢谢

【问题讨论】:

  • 您正在遍历列(使用sapply - 假设Xdata.frame),获取NA 元素的数量(通过执行逻辑向量的sum (@987654327 @) 并除以行数或机场数。
  • 我认为它按行计算了 NA 条目的百分比
  • @EnriquePérezHerrero 不是按行,按列。 (并假设Xairports 相同,或者是airports 列的子集,或者具有相同的行数。那部分根本不清楚。)
  • @srkale 它没有丢弃任何东西。总而言之删除NAs 会喜欢sum(..something.., na.rm = TRUE)。在这种情况下,求和的是每个值是否为NAsum(is.na(x)) 本质上意味着“计算xNAs 的数量”

标签: r lapply na sapply


【解决方案1】:

足够多的cmets,是时候回答了:

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)

正如我在 cmets 中提到的,没有任何东西被“丢弃”。如果你想做一个sum 忽略NA 值,你可以做sum(foo, na.rm = TRUE)。相反,这里*被求和的是is.na(x),也就是说,我们正在对每个值是否缺失进行求和:计算缺失值。 sum(is.na(foo)) 是计算fooNA 值数量的惯用方式。

在这种情况下,目标是百分比而不是计数,我们可以通过使用 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

【讨论】:

  • 感谢您的解释!我很感激!
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2022-12-07
  • 1970-01-01
相关资源
最近更新 更多