基于组不变列值的条件分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于组不变列值的条件分组相关的知识,希望对你有一定的参考价值。

我有一个数据框:

temp = as.data.frame(matrix(c(1,2,2,-3,1,1,2,3,-2,0,2,1,-5,1,1,2,1,3,0,0,3,2,4,-1,1,3,2,2,0,1,3,2,4,3,0), ncol=5,byrow = TRUE))
colnames(temp) = c("ID","srch","utility","reutility","code")

我需要按“ ID”列进行分组。对于任何“ ID”值,“ srch”列均保持不变。对于每个组,如果srch> 1,则需要min(utility,其中code == 1)-max(reutility,其中code == 0)否则(例如,如果srch <= 1),我需要将其设置为0。

这是我需要的输出:

temp = as.data.frame(matrix(c(1,4,2,0,3,-1), ncol=2,byrow = TRUE))
colnames(temp)=c("ID","Val")

使用dplyr的任何代码都很棒,但也欢迎使用其他代码。

答案

假设ID = 2的输出为0,我们可以这样做:

library(dplyr)

temp %>%
  group_by(ID) %>%
  summarise(Val = if(first(srch) > 1) min(utility[code == 1]) - 
                                      max(reutility[code == 0]) else 0)

# A tibble: 3 x 2
#     ID   Val
#  <dbl> <dbl>
#1     1     4
#2     2     0
#3     3    -1
另一答案

您可以做:

temp %>%
  group_by(ID) %>%
  mutate(
    Val = case_when(
      srch > 1 ~ min(utility[code == 1]) - max(reutility[code == 0]),
      srch <= 1 ~ min(utility[code == 1])
    )
  ) %>% distinct(ID, Val)

输出:

# A tibble: 3 x 2
# Groups:   ID [3]
     ID   Val
  <dbl> <dbl>
1     1     4
2     2    -5
3     3    -1

以上是关于基于组不变列值的条件分组的主要内容,如果未能解决你的问题,请参考以下文章

基于列值的条件连接

排序,分组,并获取特定列值的行和行+ 1?

Python - 基于列值(或子集)的分组(或循环)

有没有一种有效的方法来计算 Pandas 中的列值,使用基于其他列的条件值的前行的值?

列值的 SQL 分组 [重复]

Django:分组然后通过查询计算列值的总和