【问题标题】:How to use condition statement in pipe in r如何在r中的管道中使用条件语句
【发布时间】:2021-04-22 02:27:56
【问题描述】:

我试图在管道中使用条件语句但失败了。

数据如下:

group = rep(letters[1:3], each = 3)
status = c(T,T,T,  T,T,F,  F,F,F)
value  = c(1:9)

df = data.frame(group = group, status = status, value = value)

> df
  group status value
1     a   TRUE     1
2     a   TRUE     2
3     a   TRUE     3
4     b   TRUE     4
5     b   TRUE     5
6     b  FALSE     6
7     c  FALSE     7
8     c  FALSE     8
9     c  FALSE     9

我想获取每个group 中最大value 的行,条件是如果每个group 中的任何statusTRUE,那么filter(status == T) %>% slice_max(value)slice_max(value) 否则。

我试过的是这样的:

# way 1
df %>% 
  group_by(group) %>% 
  if(any(status) == T) {
    filter(status == T) %>% slice_max(value)
  } else {
    slice_max(value)
  }

# way 2 
df %>% 
  group_by(group) %>% 
  when(any(status) == T,
    filter(status == T) %>% slice_max(value),
    slice_max(value))

我期望的输出应该是这样的:

> expected_df
  group status value
1     a   TRUE     3
2     b   TRUE     5
3     c  FALSE     9

任何帮助将不胜感激!

【问题讨论】:

    标签: r if-statement dplyr tidyverse


    【解决方案1】:

    尝试按状态然后按值排列数据,然后只取第一个结果

    df %>% 
      group_by(group) %>% 
      arrange(!status, desc(value)) %>% 
      slice(1)
    

    由于我们是按状态排列的,如果它们有一个TRUE值,它会先出现,如果没有,那么你只是得到最大值。一般来说,将管道和if 语句结合起来有点尴尬,但如果这是您想要研究的内容,this existing question 中会介绍,但if 语句不适用于group_by

    【讨论】:

    • 谢谢,有一点就是!desc()有一样的效果?
    • 在这种情况下,有点。 ! 翻转 true 和 false,因此它仅适用于逻辑值,但 desc() 更通用,适用于更多类。
    • 嗨弗利克,我有一个新问题。我想也许你可以帮助我。如果您能看看我的新问题,我将不胜感激。 stackoverflow.com/questions/67378023/…
    【解决方案2】:

    再详细一点:

    library(dplyr)
    
    df %>%
      group_by(group) %>%
      filter(if(any(status)) value ==max(value[status]) else value == max(value)) %>%
      ungroup
    
    #  group status value
    #  <chr> <lgl>  <int>
    #1 a     TRUE       3
    #2 b     TRUE       5
    #3 c     FALSE      9
    

    【讨论】:

    【解决方案3】:
    df %>% 
       group_by(group) %>%
       slice(which.max(value*(all(!status)|status)))
    # A tibble: 3 x 3
    # Groups:   group [3]
      group status value
      <chr> <lgl>  <int>
    1 a     TRUE       3
    2 b     TRUE       5
    3 c     FALSE      9
    

    虽然最好是整理资料

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多