【问题标题】:does tapply by default excludes the NA on the variable passed for segmentation?默认情况下,tapply 会排除传递给分段的变量的 NA 吗?
【发布时间】:2018-07-23 05:45:37
【问题描述】:

我有一个数据框 (a),其中两列是 total_amountGender。我需要计算男性和女性的总消费金额。

在“性别”列中,还有NAs。在运行以下命令时

tapply(a$total_amount,a$Gender, sum)

结果是:

 F        M 
23623513 24935632

我的查询是:tapply 默认情况下是否会删除选择用于分类的细分列中的缺失值,即在这种情况下为性别?如果是,那么我们如何将它们包含在我们的结果中?

【问题讨论】:

  • 请展示一个可重现的小例子。我们不知道您的数据结构。通常,如果存在 NA,并且您没有在 sum 中提供 na.rm=TRUE,那么该值将是 NA tapply(c(NA, 3, 4, 2), rep(1:2, 2), FUN = sum) #1 2 NA 5

标签: r tapply


【解决方案1】:

如果我们查看help(tapply),

tapply(X, INDEX, FUN = NULL, ..., 默认 = NA, 简化 = TRUE)

INDEX:一个或多个“因子”的“列表”,每个因子的长度与 'X'。元素被“as.factor”强制转换为因子。

通过检查tapply 代码

INDEX <- lapply(INDEX, as.factor)
...
namelist <- lapply(INDEX, levels)

这意味着,分组变量被转换为factorfactor 中的 levels 不包括 NA 元素,这就是输出中我们没有任何 NA 作为组的原因

tapply(c(3, 4, 2, 6), c(NA, 1, 3, 4), sum) 
#  1 3 4 
#  4 2 6 

但是,如果将NA 元素转换为字符串,则转换为factor 时将是level

tapply(c(3, 4, 2, 6), c("NA", 1, 3, 4), sum)
# 1  3  4 NA 
# 4  2  6  3 

【讨论】:

    【解决方案2】:

    是的,确实如此。

    您可以发送sum(is.na(a$Gender))。这将为您提供具有NA 的行数。 如果您想查看各个NA 的总和,那么,

    x <- a[is.na(a$Gender), ]
    
    sum(x$gender_total)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多