【问题标题】:Tally across columns with variable condition in r在 r 中具有可变条件的列的计数
【发布时间】:2022-01-26 18:18:39
【问题描述】:

我正在尝试用超过相应限制变量的值来计算数据框的列。这是similar problem,但对于每个点,条件可能会发生变化,因此rowSums 不是一个选项。我对以下尝试的解决方案的修改、更有效的方法以及有助于解决此问题的任何更简单的方法感兴趣。

library(tidyverse)

set.seed(234)

ex_dat <- tibble(a = rnorm(n = 6, mean = 1),
                 a_lim = 0.75,
                 b = rnorm(n = 6, mean = 0.5),
                 b_lim = 0.333,
                 c = rnorm(n = 6, mean = 1.5),
                 c_lim = 1.0,
                 d = rnorm(n = 6, mean = 1.5),
                 d_lim = 1.25)

ex_dat %>% 
rowwise() %>% 
mutate(tally = sum(map_lgl(.x = c("a","b","c","d"),
.f = ~(noquote(.x) > noquote(paste0(.x,"_lim")))), na.rm = T))

例如,如果满足所有 4 个条件,则期望的结果是此处的“计数”列在第一行中显示 4。然后,它应该读取第二行的 2,因为只超出了 2 个限制。

我在这里尝试了这种方法的一些变体,使用 bang-bang 运算符强制评估 map 函数的 .f 参数中的变量。到目前为止,就我能想到的而言,这种尝试和无声的失败似乎是最接近和最明智的。显然,我对非标准评估没有非常牢靠的把握,所以我对!!sym() 的尝试并没有让我走得太远。

同样,如果有人看到我以迂回或低效的方式解决这个问题,我会欢迎重定向。谢谢。

【问题讨论】:

    标签: r dplyr quotes rlang non-standard-evaluation


    【解决方案1】:

    这里有一个稍微不同的方法来解决您的问题。它依赖于“技巧”,如果不等式为真,则为 1,如果为假,则为 0。因此,您可以针对 a、b、c 和 d 的极限求值,并对 4 个不等式的求值求和。

    library(dplyr)
    
     ex_dat_tally<-ex_dat %>%
         mutate(tally=(a>a_lim)+(b>b_lim)+(c>c_lim)+(d>d_lim))
    

    【讨论】:

    • 这很简单,它可以完成工作——谢谢。我也对另一个答案投了赞成票,因为这里实施的策略对于我在示例数据中显示的一些比较很有用,而我认为另一个对于进行许多这些比较的分析师来说更有效。更少的击键!感谢您的帮助!
    【解决方案2】:

    我发现这种基本的 R 方法直观、简单,而且应该很快,因为我们直接使用矢量化方法处理数据帧。

    lim_cols <- grep('lim', names(ex_dat), value = TRUE)
    cols <- sub('_lim', '', lim_cols)
    ex_dat$tally <- rowSums(ex_dat[cols] > ex_dat[lim_cols])
    ex_dat
    
    #      a a_lim       b b_lim     c c_lim     d d_lim tally
    #   <dbl> <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #1  1.66   0.75  0.709  0.333 1.47      1 2.03   1.25     4
    #2 -1.05   0.75 -2.54   0.333 2.01      1 1.52   1.25     2
    #3 -0.499  0.75  0.0131 0.333 2.49      1 1.71   1.25     2
    #4  2.47   0.75 -0.588  0.333 1.80      1 2.52   1.25     3
    #5  2.46   0.75  0.558  0.333 0.570     1 1.91   1.25     3
    #6  1.14   0.75  1.60   0.333 1.58      1 0.795  1.25     3
    

    这里我们创建了两组列lim_colscols

    lim_cols
    #[1] "a_lim" "b_lim" "c_lim" "d_lim"
    
    cols
    #[1] "a" "b" "c" "d" 
    

    两两比较,用rowSums计算有多少满足条件。

    【讨论】:

    • 赞成!进行许多此类比较的绝佳解决方案-谢谢。我接受了另一个答案,因为它与问题的dplyr 上下文更加一致,并且考虑到只需进行少量比较,这种基本 r 方法的效率提升并不是很高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多