首页 > 解决方案 > 对列值(group_by)求和,保持 NA 值,而不是用 R 中的零替换

问题描述

我试图将列值按另一列分组,我需要保留 NA 值,我不应该用零替换值,因为基于总和,如果总和为 NA,我必须给出 Rank 等级应该为空。

以下是理解问题的示例

列 1 列 2 列 3

一个 10 英镑

b gb 不适用

cgb 不适用

d 国标 4

e Hs 81

b Hs NA

c Hs 2

一个 Rd NA

x Rd 不适用

z Rd NA

我必须按 column2 对 column3 值进行求和,并且在进行求和时,我不应该考虑 NA 值并将该组的其他值相加,我不应该删除或用零替换 NA 值。基于这个总和,如果总和为 NA(参考组 Rd),我必须给出排名,那么将没有排名。我可以用零替换 NA 值,但我必须在 sum 之后给出排名,如果 sum 为 NA,排名将为空(如果是上述数据中的 Rd 组)。对于 gb 组,总和值为 14,Hs 组总和值为 83,Rd 组总和值为 NA,在这种情况下,该组将没有排名。

下面是我试过的代码片段

df %>% group_by_at(column2) %>% summarise(sum = sum(column3, na.rm = TRUE))

上面的代码通过将所有 NA 替换为零来求和值,但我不想替换。我需要 NA 给予排名。你能提供任何解决方案吗?

预期输出:

column2 column3 排名

国标 14 2

HS 83 1

Rd NA 无等级

标签: r

解决方案


基础 R 解决方案:

within(aggregate(column3~column2, df, FUN = function(x){
    ifelse(all(is.na(x)), NA_integer_, sum(x, na.rm = TRUE))}, 
    na.action = na.pass), {rank = ifelse(is.na(column3), NA_integer_,
                                         rank(-column3))})

推荐阅读