在 r 中具有可变条件的列之间的计数

Tally across columns with variable condition in r

提问人:SGE 提问时间:12/28/2021 最后编辑:Anoushiravan RSGE 更新时间:12/28/2021 访问量:470

问:

我正在尝试对数据帧的列进行计数,其值超过相应的限制变量。这是一个类似的问题,但对于每个点,条件可能会发生变化,因此不是一种选择。我对下面尝试的解决方案的修改、任何更有效的方法以及任何有助于解决此问题的更简单的方法感兴趣。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 运算符来强制计算函数参数中的变量。到目前为止,这种尝试和无声的失败似乎是我所能理解的最接近和最明智的。显然,我对非标准评估没有很牢固的把握,所以我的尝试并没有让我走得太远。.fmap!!sym()

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

r dplyr 引用 rlang 非标准评估

评论


答:

1赞 Joe Erinjeri 12/28/2021 #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))

评论

0赞 SGE 12/29/2021
这很简单,它完成了工作 - 谢谢。我也对另一个答案投赞成票,因为这里实施的策略对于一些比较很有用,就像我在示例数据中显示的那样,而我认为另一个策略对于进行许多这些比较的分析师来说更有效。更少的击键!感谢您的帮助!
1赞 Ronak Shah 12/28/2021 #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

评论

0赞 SGE 12/29/2021
点赞!进行许多此类比较的绝佳解决方案 - 谢谢。我接受了另一个答案,因为它更符合问题的上下文,并且考虑到只有几个比较可以做,这种基本 r 方法的效率增益不是很高。dplyr