【问题标题】:How to sum a variable by group and make sure if every variable in a group is a NA the sum is NA instead of zero? [duplicate]如何按组对变量求和并确保组中的每个变量都是 NA 总和是 NA 而不是零? [复制]
【发布时间】:2021-08-16 16:08:23
【问题描述】:

我有如下数据示例:

| a | b |
|---|---|
| 1 | 1 |
| 1 | 0 |
| 2 | 1 |
| 2 | NA|
| 3 | 0 |
| 4 | NA|
| 4 | NA|
| 4 | NA|
| 5 | 1 |
| 5 | NA|
| 5 | 0 |
| 5 | 1 |
| 6 | 0 |

我需要通过对依赖于ab 求和来创建一个新数据框,如果组中的每个数据都是 NA,则输出应该是 NA 而不是零,如下所示:

| a | b |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 0 |
| 4 | NA|
| 5 | 2 |
| 6 | 0 |

如何在 R 中构造一个总和以使其表现得像这样?

谢谢

【问题讨论】:

  • 您能添加一份您的初始数据吗?

标签: r dataframe sum


【解决方案1】:

使用aggregate 的基本 R 选项

aggregate(. ~ a,
  df, 
  function(x) ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE)),
  na.action = na.pass
)

给予

  a  b
1 1  1
2 2  1
3 3  0
4 4 NA
5 5  2
6 6  0

数据

> dput(df)
structure(list(a = c(1L, 1L, 2L, 2L, 3L, 4L, 4L, 4L, 5L, 5L, 
5L, 5L, 6L), b = c(1L, 0L, 1L, NA, 0L, NA, NA, NA, 1L, NA, 0L,
1L, 0L)), class = "data.frame", row.names = c(NA, -13L))
´``

【讨论】:

    【解决方案2】:

    使用来自hablarmean_

    library(dplyr)
    library(hablar)
    df %>% 
        group_by(a) %>%
        summarise(b = sum_(b))
    

    -输出

    # A tibble: 6 x 2
          a     b
      <int> <int>
    1     1     1
    2     2     1
    3     3     0
    4     4    NA
    5     5     2
    6     6     0
    

    数据

    df <- structure(list(a = c(1L, 1L, 2L, 2L, 3L, 4L, 4L, 4L, 5L, 5L, 
    5L, 5L, 6L), b = c(1L, 0L, 1L, NA, 0L, NA, NA, NA, 1L, NA, 0L,
    1L, 0L)), class = "data.frame", row.names = c(NA, -13L))
    

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2019-10-09
      • 1970-01-01
      • 2022-11-19
      相关资源
      最近更新 更多