gpt4 book ai didi

r - 基于数据帧 R 中的组的条件聚合

转载 作者:行者123 更新时间:2023-12-03 18:47:11 24 4
gpt4 key购买 nike

Data_Frame <- data.frame(Col1 = c("A1", "A1", "A1", "A2", "A2", "A2", "A3", "A3", "A3"),

Col2 = c("2011-03-11", "2014-08-21", "2016-01-17", "2017-06-30", "2018-07-11", "2018-11-28", "2019-09-04", "2020-02-29", "2020-07-12"),

Col3 = c("2018-10-22", "2019-05-24", "2020-12-25", "2018-10-12", "2019-09-24", "2020-12-19", "2018-10-22", "2019-06-14", "2020-12-20"),

Col4 = c(4, 2, 2, 1, 4, 4, 4, 4, 4),

Col5 = c(7, 6, 3, 1, 3, 2, 5, 1, 2))

Data_Frame$Col2 <- as.Date(Data_Frame$Col2)
Data_Frame$Col3 <- as.Date(Data_Frame$Col3)
Data_Frame$Col1 <- as.factor(Data_Frame$Col1)

Data_Frame <- Data_Frame %>% group_by(Col1) %>% mutate(Col6 = lubridate::time_length(lubridate::interval(Col2, max(Col3)), "years"))

Data_Frame <- Data_Frame %>% group_by(Col1) %>% dplyr::mutate(Col7 = ifelse(Col6 <= 1, 1, ifelse(Col6 >1 & Col6 <=2, 2, ifelse(Col6 >2 & Col6 <=5, 5, ifelse(Col6 >5 & Col6 <=10, 10, 11)))))

Data_Frame <- as.data.frame(Data_Frame)
是其中 Col6 表示 Col2 和 Col3 之间的时间差的数据帧,其中 Col2 的元素从 Col1 中 A1 到 A3 各组中 Col3 中最大的日期元素减去,Col7 表示 Col6 中哪些元素 <=1,<=2, <=5 和 <=10。
不同条件生成的附加列存在问题。
  • Last1Col7 到 Last10Col7 的生成:

  • 新列 Last1Col7 到 Last10Col7 基于 Col7 创建,并将 Col7 中的 A1 到 A3 分组,使得
  • Last1Col7 表示 Col7 中有多少个元素(行数)
    <=每组1个,
  • Last2Col7 对应于行数 <=2 in
    每组,
  • Last5Col7 对应于每行 <=5 的行数
    组等等。

  • 预期的结果是:
    enter image description here
    以下代码:
    Data_Frame1 <- Data_Frame %>% group_by(Col1) %>% dplyr::mutate(Last1Col7 = nrow(Data_Frame[Data_Frame$Col7 <= 1, ]),

    Last2Col7 = nrow(Data_Frame[Data_Frame$Col7 <= 2, ]),

    Last5Col7 = nrow(Data_Frame[Data_Frame$Col7 <= 5, ]),

    Last10Col7 = nrow(Data_Frame[Data_Frame$Col7 <= 10, ]))
    导致完全不同的结果:
    enter image description here
  • Last1SumCol4Col7 到 Last10SumCol4Col7 的生成:
  • Last1SumCol4Col7 是 Col4 中条目的总和,对应 Col7 中的条目数(行数)<=1 在 Col1 中 A1 到 A3 的每组中,
  • Last2SumCol4Col7 是 Col4 中条目的总和,对应于 Col1 中 A1 到 A3 的每组中 Col7 中有多少条目(行数)<=2,
  • Last5SumCol4Col7 是 Col4 中条目的总和,对应于 Col7 中的条目数(行数)<=5 在 Col1 中的每组 A1 到 A3 中,
  • Last10SumCol4Col7 是Col4中条目的总和,对应Col7中每组A1到A3中有多少条目(行数)<=10


  • 预期的结果是:
    enter image description here
    使用以下代码:
    Data_Frame1 <- Data_Frame %>% group_by(Col1) %>% dplyr::mutate(Last1SumCol4Col7 = sum(Data_Frame[Data_Frame$Col7 <=1, ]$Col4),

    Last2SumCol4Col7 = sum(Data_Frame[Data_Frame$Col7 <=2, ]$Col4),

    Last5SumCol4Col7 = sum(Data_Frame[Data_Frame$Col7 <=5, ]$Col4),

    Last10SumCol4Col7 = sum(Data_Frame[Data_Frame$Col7 <=10, ]$Col4))
    结果是:
    enter image description here
    从 Last1Col7 到 Last10Col7 和 Last1SumCol4Col7 到 Last10SumCol4Col7 的所有初始条目为零的列开始,然后使用上面的代码也无济于事。 1 和 3 下的代码从根本上出了什么问题?

    最佳答案

    我们可以使用 map循环比较中使用的值,然后按“Col1”分组,通过取 sum 在每个循环中创建两列'Col7' 小于或等于循环的值,以及 sum 'Col4' 的对应值,其中 'Col7' 小于或等于该值

    library(purrr)
    library(dplyr)
    map_dfc(c(1, 2, 5, 10), ~ Data_Frame %>%
    group_by(Col1) %>%
    transmute(!! sprintf("Last%dCol7", .x) := sum(Col7 <= .x),
    !! sprintf("Last%dSumCol4Col7", .x) := sum(Col4[Col7<= .x])) %>%
    ungroup %>%
    select(-Col1)) %>%
    bind_cols(Data_Frame, .)
    -输出
    #Col1       Col2       Col3 Col4 Col5      Col6 Col7 Last1Col7 Last1SumCol4Col7 Last2Col7 Last2SumCol4Col7 Last5Col7 Last5SumCol4Col7 Last10Col7
    #1 A1 2011-03-11 2018-10-22 4 7 9.7917808 10 0 0 0 0 1 2 3
    #2 A1 2014-08-21 2019-05-24 2 6 6.3452055 10 0 0 0 0 1 2 3
    #3 A1 2016-01-17 2020-12-25 2 3 4.9371585 5 0 0 0 0 1 2 3
    #4 A2 2017-06-30 2018-10-12 1 1 3.4712329 5 0 0 0 0 3 9 3
    #5 A2 2018-07-11 2019-09-24 4 3 2.4410959 5 0 0 0 0 3 9 3
    #6 A2 2018-11-28 2020-12-19 4 2 2.0575342 5 0 0 0 0 3 9 3
    #7 A3 2019-09-04 2018-10-22 4 5 1.2931507 2 2 8 3 12 3 12 3
    #8 A3 2020-02-29 2019-06-14 4 1 0.8060109 1 2 8 3 12 3 12 3
    #9 A3 2020-07-12 2020-12-20 4 2 0.4410959 1 2 8 3 12 3 12 3
    # Last10SumCol4Col7
    #1 8
    #2 8
    #3 8
    #4 9
    #5 9
    #6 9
    #7 12
    #8 12
    #9 12

    OP 代码中的问题给出错误 sum是因为 Data_Frame[Data_Frame$Col7 <=2, ]正在破坏组并获取整个列子集而不是组内的子集。内 tidyverse ,我们不需要 Data_Frame$ ,如果我们需要指定数据,使用 .cur_data() .另外,这里我们只需要 Col7 <=2

    关于r - 基于数据帧 R 中的组的条件聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67764294/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com