首页 > 解决方案 > 在R中按组和条件查找列的最大值

问题描述

我在 R 中有两个 data.tables。

表 A 具有 ID_A、天数和组。

表 B 有 ID_B、days、group 和 value_of_interest。

我正在尝试向 A 添加一列 max_value_of_interest,其中该值是组中所有行中 value_of_interest 的最大值,其中 B 中的天数大于表 A 中的天数。

我会尝试用另一种方式来描述它:

表 A:

ID_A    days    group
A1      5       X

我想向 A 添加一列,其中包含来自 B 的最大值 value_of_interest,其中最大值从 B 中选择,其中 B.group=X 和 B.days > 5(大于 A1 行中的值)。

我找到了按组查找最大值的解决方案,但我无法弄清楚如何添加一个条件以仅考虑 B.days by group > A.days 的值。

我不确定解决这个问题的最佳方法。我会很感激任何帮助。

标签: r

解决方案


循环遍历表 A 的行可能是最简单的。对于每一行,选择 B 的相关行,然后找到最大值。

library(tidyverse)
A <- tibble(ID_A=paste("A", 1:5, sep=""), 
            days=seq(5,1,-1), 
            group=c("X", "X", "X", "Y", "Y"),
            max_val=NA)
B <- tibble(ID_B=paste("A", 1:5, sep=""), 
            days=seq(3,7,1), 
            group=c("X", "X", "X", "Y", "Y"),
            val=runif(5))

for (i in 1:nrow(A)){
  B_sel <- B %>%
    filter(group==A$group[i] & days>A$days[i]) 
  if (nrow(B_sel)>0)
    A$max_val[i] <- max(B_sel$val)
}

或者

for (i in 1:nrow(A)){
  rows <- which(B$group==A$group[i] & B$days>A$days[i]) 
  if (length(rows)>0)
    A$max_val[i] <- max(B$val[rows])
}

推荐阅读