R:按组总结n和1的数量

2ledvvac  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(123)

我有一个数据集,格式如下:

library(dplyr)
set.seed(420)
data <- data.frame(duration = c(3, 5, 6, 8, 10),
                   rate = c(0.2, 0.5, 0.8, 0.85, 0.9)) %>%
  slice_sample(n = 705, replace = TRUE) %>%
  rowwise() %>%
  mutate(cured = sample(0:1, 1, prob = c(1 - rate, rate))) %>%
  select(-rate)
head(data)

  duration cured
     <dbl> <int>
1       10     1
2       10     1
3        5     1
4        3     1
5       10     0
6       10     1

我想用duration来总结1的个数和总数(注意这是一个数字而不是一个因子,但总是整数)。我可以这样做:

data %>%
  group_by(duration) %>%
  summarise(n = n(),
            npos = sum(cured, na.rm = TRUE),
            rate = npos / n)

  duration     n  npos  rate
     <dbl> <int> <int> <dbl>
1        3   139    30 0.216
2        5   130    79 0.608
3        6   143   123 0.860
4        8   155   127 0.819
5       10   138   118 0.855

这很好用,但是我遇到了列名durationcured不一定要这样命名的情况,所以我想将其作为变量传入。(这最终将在一个包中)。此外,如果cured中缺少数据,可以从摘要中的nnpos列中完全忽略它。
最后,我使用pull(rate)rate列作为一个向量-是否有一个基R等价物?

2hh7jdfx

2hh7jdfx1#

我们可以使用aggregate,并使用[[进行提取,例如像这样:

fun <- function(data, x, y) {

aggregate(data[x],
          by = data[y],
          FUN = \(x) sum(x, na.rm = FALSE) / length(na.omit(x)))[[x]]

}

fun(data, "cured", "duration")

输出:

[1] 0.2158273 0.6076923 0.8601399 0.8193548 0.8550725
9njqaruj

9njqaruj2#

下面是使用mean的另一种方法:
1.我们aggregatexy
1.然后我们应用mean来计算每组中的平均值。
1.最后我们提取第二列。

fun <- function(data, x, y) {
  aggregate(data[,x], list(data[,y]), \(x) mean(x, na.rm = TRUE))[ , 2]
}

fun(data, "cured", "duration")
[1] 0.2158273 0.6076923 0.8601399 0.8193548 0.8550725

相关问题