通过 R 中的组查找布尔值是否为真

finding if boolean is ever true by groups in R

我想要一种简单的方法来创建一个新变量来确定布尔值在 R 数据框中是否永远为真。 这是一个例子: 假设在数据集中我有 2 个变量(在其他不相关的变量中)'a' 和 'b' 并且 'a' 确定一个组,而 'b' 是一个值为 TRUE 的布尔值(1) 或假 (0)。我想创建一个变量 'c',它也是一个布尔值,对于 'b' 至少有一次 'TRUE' 的组中的所有条目为 1,对于其中 'TRUE' 的组中的所有条目为 0 =19=] 永远不会是真的。 来自如下条目:

a   b
-----
1   1 
2   0
1   0
1   0
1   1
2   0
2   0
3   0
3   1
3   0

我想获得如下变量 'c':

a   b   c
-----------
1   1   1 
2   0   0
1   0   1
1   0   1
1   1   1
2   0   0
2   0   0
3   0   1
3   1   1
3   0   1
-----------

我知道如何在 Stata 中做,但我还没有在 R 中做过类似的事情,而且在互联网上很难找到这方面的信息。 事实上,我这样做只是为了以后删除 'c' 为 0 的所有观察结果,因此任何其他建议也可以。它的应用与多项式logit估计有关,其中从未选择过的备选方案需要在估计之前从数据集中删除。

如果 X 是您的数据框

library(dplyr)
X <- X %>%
  group_by(a) %>%
  mutate(c = any(b == 1))

假设 ab 在数据帧 x

中,基数为 R 的答案

c值是与a的一对一映射,我在这里创建一个映射

cmap <- ifelse(sapply(split(x, x$a), function(x) sum(x[, "b"])) > 0, 1, 0)

然后将映射值添加到数据框中

x$c <- cmap[x$a]

最终输出

> x
   a b c
1  1 1 1
2  2 0 0
3  1 0 1
4  1 0 1
5  1 1 1
6  2 0 0
7  2 0 0
8  3 0 1
9  3 1 1
10 3 0 1

编辑以将调用更改为拆分。

基础 R 选项是

 df1$c <- with(df1, ave(b, a, FUN=any))

或者

 library(sqldf)
 sqldf('select * from df1
      left join(select a, b,
         (sum(b))>0 as c
         from df1 
         group by a)
         using(a)')

简单data.table方法

require(data.table)
data <- data.table(data)
data[, c := any(b), by = a]

即使逻辑列和数字 (0-1) 列在所有意图和目的上的行为都相同,但如果您想要一个数字结果,您可以简单地用 as.numeric 包装对 any 的调用.