【问题标题】:Iteration through rows of a dataframe within group of columns in R在 R 中的列组内遍历数据帧的行
【发布时间】:2021-03-14 20:18:46
【问题描述】:

我有一个包含 6 个字段 A、B、C、D、E 和 F 的数据框 df。我的要求是创建一个新列 G,它等于前一个值(C)+ 前一个值(D)+ 前一个(G) - F. 但这需要通过列 A 和 B(按 A 和 B 分组)在组级别实现。如果它是组内的第一行,则 G 列中的值应等于 E。

样本 Df -

A   B   C   D   E   F
1   2   100 200 300 0
1   2   110 210 310 10
1   2   120 130 300 10
1   1   140 150 80  0
1   1   50  60  80  20
1   1   50  60  80  20

输出 -

A   B   C   D   E   F   G
1   2   100 200 300 0   300
1   2   110 210 310 10  590
1   2   120 130 300 10  900
1   1   140 150 80  0   80
1   1   50  60  80  20  350
1   1   50  60  80  20  440

请提供合适的解决方案。

【问题讨论】:

    标签: r dataframe loops iteration


    【解决方案1】:

    这是dplyr 的一个选项,我们按“A”、“B”分组,取“C”、“D”、“E”中的lag 添加(+)它们,然后减去从“F”,并与“E”列合并

    library(dplyr)
    df1 %>%
        group_by(A, B) %>%
         mutate(G = coalesce(lag(C) + lag(D) + lag(E) - F, E))
    

    -输出

    # A tibble: 6 x 7
    # Groups:   A, B [2]
    #      A     B     C     D     E     F     G
    #  <int> <int> <int> <int> <int> <int> <int>
    #1     1     2   100   200   300     0   300
    #2     1     2   110   210   310    10   590
    #3     1     2   120   130   300    10   620
    #4     1     1   140   150    80     0    80
    #5     1     1    50    60    80    20   350
    #6     1     1    50    60    80    20   170
    

    数据

    df1 <- structure(list(A = c(1L, 1L, 1L, 1L, 1L, 1L), B = c(2L, 2L, 2L, 
    1L, 1L, 1L), C = c(100L, 110L, 120L, 140L, 50L, 50L), D = c(200L, 
    210L, 130L, 150L, 60L, 60L), E = c(300L, 310L, 300L, 80L, 80L, 
    80L), F = c(0L, 10L, 10L, 0L, 20L, 20L)), class = "data.frame",
    row.names = c(NA, 
    -6L))
    

    【讨论】:

    • 谢谢,但 G 列的计算有误。 G列应计算为先前值(C)+先前值(D)+先前(G)-F。如果它是组中的第一行,则G列中的值应等于E。我已经做了上面原始帖子中的更改。请帮忙。
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2021-06-25
    • 2021-11-22
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多