【问题标题】:Comparing other rows with current row and do conditional sum in R将其他行与当前行进行比较并在 R 中进行条件求和
【发布时间】:2020-05-13 11:41:52
【问题描述】:

示例数据如下所示。

    data <- data.frame(Name=c('John','John','John','Mary','Mary'),First_value=c(1,3,2,4,5),Second_value=c(3,4,2,7,5),To_sum=c(1,2,3,4,5))  

    # Name First_value Second_value To_sum
    # John      1           3          1
    # John      3           4          2
    # John      2           2          3
    # Mary      4           7          4
    # Mary      5           5          5

我想首先按名称分组,并且对于每个组,如果其他行具有“First_value”,则将“To_sum”列相加" 大于当前行AND 小于当前行的“Second_value”。如果当前行没有要求和的值,则新列将为 0。

新列应该如下:

    # Name First_value Second_value To_sum New_column
    # John      1           3          1        3
    # John      3           4          2        0
    # John      2           2          3        0
    # Mary      4           7          4        5
    # Mary      5           5          5        0

【问题讨论】:

    标签: r loops conditional-statements grouping lapply


    【解决方案1】:

    添加一个id列,可以使用自连接和过滤的方式:

    data = mutate(data, id = 1:n())
    
    data %>%
      full_join(., ., by = "Name") %>%
      filter(id.x != id.y, First_value.x < First_value.y, Second_value.x > Second_value.y) %>%
      group_by(Name, id = id.x) %>%
      summarize(New_column = sum(To_sum.y)) %>%
      right_join(data) %>%
      mutate(New_column = coalesce(New_column, 0))
    # Joining, by = c("Name", "id")
    # # A tibble: 5 x 6
    # # Groups:   Name [2]
    #   Name     id New_column First_value Second_value To_sum
    #   <fct> <int>      <dbl>       <dbl>        <dbl>  <dbl>
    # 1 John      1          3           1            3      1
    # 2 John      2          0           3            4      2
    # 3 John      3          0           2            2      3
    # 4 Mary      4          5           4            7      4
    # 5 Mary      5          0           5            5      5
    

    【讨论】:

      【解决方案2】:

      您可以将dplyrpurrr::map_dbl 一起使用

      library(dplyr)
      
      data %>%
        group_by(Name) %>%
        mutate(New_column = purrr::map_dbl(row_number(), 
           ~sum(To_sum[First_value > First_value[.x] & Second_value < Second_value[.x]])))
      
      # Name  First_value Second_value To_sum  New_column
      #  <fct>       <dbl>        <dbl>  <dbl>      <dbl>
      #1 John            1            3      1          3
      #2 John            3            4      2          0
      #3 John            2            2      3          0
      #4 Mary            4            7      4          5
      #5 Mary            5            5      5          0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多