【问题标题】:Using lapply to sum a subset of a dataframe使用 lapply 对数据帧的子集求和
【发布时间】:2022-01-25 17:02:44
【问题描述】:

我对 R 和使用 lapply 还是很陌生。我有一个大数据框,我正在尝试使用 lapply 来输出此数据框的某些子集的总和。

group_a group_b n_variants_a n_variants_b
1 NA 1 2
NA 2 5 4
1 2 2 0

我想查看基于多个不同组(group_a、group_b)的子集并对 n_variants 的每一列求和。

仅在一组和 n_variant 集上运行它:

sum(subset(df, (!is.na(group_a)))$n_variants_a 

但是,我想根据每个分组对每个 n_variant 列求和。我的 lapply 脚本为每个总和输出 0 值。

summed_variants <- lapply(list_of_groups, function(g) {
              lapply(list_of_variants, function(v) {
                sum(subset(df, !(is.na(g)))$v)

我想知道是否需要使用 paste0 来粘贴变体列表,但我无法让它工作。

感谢您的帮助!

【问题讨论】:

    标签: r sum subset lapply


    【解决方案1】:

    我们可以为此使用Map/mapply - 循环组名及其对应的“n_variants”(假设它们按顺序排列),根据名称提取列,应用条件 (!is.na),子集'n_variants' 并获得 sum

    mapply(function(x, y) sum(df1[[y]][!is.na(df1[[x]])]), 
         names(df1)[1:2], names(df1)[3:4])
    group_a group_b 
          3       4 
    

    或者可以使用tidyverse 完成另一个选项。循环 across 'n_variants' 列,获取列名 (cur_column()) 将子字符串替换为 'group',get 值,创建条件以子集列并获取 sum

    library(stringr)
    library(dplyr)
    df1 %>% 
      summarise(across(contains('variants'),
        ~ sum(.x[!is.na(get(str_replace(cur_column(), 'n_variants', 'group')))])))
    

    -输出

      n_variants_a n_variants_b
    1            3            4
    

    数据

    df1 <- structure(list(group_a = c(1L, NA, 1L), group_b = c(NA, 2L, 2L
    ), n_variants_a = c(1L, 5L, 2L), n_variants_b = c(2L, 4L, 0L)), 
    class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

    • 非常感谢 - 它让我更接近我正在寻找的东西,但是我希望获得每个组子集的每个变体的总和。所以我希望输出是: n_variants_a for group a=3; n_variants_b 用于组 a=2,n_variants_a 用于组 b=7,n_variants_b 用于组_b=4。所以我希望为每个组子集输出每个 n_variants - 这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 2018-03-31
    • 2018-06-08
    • 2020-09-11
    • 2014-02-10
    • 1970-01-01
    • 2019-07-08
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多