【问题标题】:Using pmap function to check whether all values in a row are positive or negative使用 pmap 函数检查一行中的所有值是正数还是负数
【发布时间】:2021-04-10 17:07:38
【问题描述】:

我有这个数据框,我想只使用pmap 函数来过滤所有值为负数或正数的行。我正在寻找一种简洁的方法,因为我想到了c(...),但我们只能在函数中使用它。 这段代码可以实现:

df <- tibble(x = c("a", "b", "c"), y = c(1, -1, -1), z = c(1, -1, 1), 
             p = c(1, -1, -1))

df %>%
  filter(pmap_lgl(list(y, z, p), ~ ..1 > 0 & ..2 > 0 & ..3 > 0  | 
                    ..1 < 0 & ..2 < 0 & ..3 < 0))

# A tibble: 2 x 4
  x         y     z     p
  <chr> <dbl> <dbl> <dbl>
1 a         1     1     1
2 b        -1    -1    -1

因此,我正在寻找一种将谓词应用于所有值的方法,以防我有超过 3 个列,我不想这样命名或引用它们。

任何帮助将不胜感激,并在此先感谢您。

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    我们可以使用if_all

    library(dplyr)
    df %>% 
        filter(across(where(is.numeric), ~ . > 0)|
               if_all(where(is.numeric), ~ . < 0))
    

    -输出

    # A tibble: 2 x 4
    #  x         y     z     p
    #  <chr> <dbl> <dbl> <dbl>
    #1 a         1     1     1
    #2 b        -1    -1    -1
    

    或者用pmap通过selectnumeric列,检查all的值是小于0还是|大于0

    library(purrr)
    df %>%
       filter(pmap_lgl(select(., where(is.numeric)), 
                  ~ all(c(...) < 0)| all(c(...)> 0)))
    

    -输出

    # A tibble: 2 x 4
    #  x         y     z     p
    #  <chr> <dbl> <dbl> <dbl>
    #1 a         1     1     1
    #2 b        -1    -1    -1
    

    【讨论】:

    • 亲爱的 Arun,我已经使用了 across 函数加上 if_all ,但我想知道如何修改 pmap 以返回相同的结果,因为一旦你对所有可能的变化。然而,在那个例子中,我们有一个像 which.max() 这样的函数,让它变得更容易。
    • 非常感谢。我使用了all,但我的错误是在调用中不包括0,而是在调用之外。像往常一样,你来救援。亲爱的阿伦,我感激不尽。
    • 如果我们将 across 语句替换为 if_all 语句不起作用,我会感到很惊讶。我觉得如果说所有都是积极的还是消极的会更优雅。 @akrun 你知道为什么这不起作用吗?
    • @WilliamGram 是的,今天早些时候,我们和朋友一起尝试了另一个问题。似乎为了检查这两个条件(全部为正面或全部为负面),我们需要同时使用 if_allacrossif_any
    • 我很困惑,直到我意识到 if_all 是 1.0.4 中的新内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多