繁体   English   中英

将其他行与当前行进行比较并在 R 中进行条件求和

[英]Comparing other rows with current row and do conditional sum in R

示例数据如下所示。

    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

我想第一组的名字,并为每个组,总结该组中的所有其他行的列“To_sum”(除了当前行),如果其他行有一个“FIRST_VALUE”大于当前行“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

您可以将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

添加一个 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM