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

3

我希望有一种简单的方法,在R数据框中创建一个新变量来确定布尔值是否为真。 以下是一个例子: 假设在数据集中,除了‘a’和‘b’之外还有其他不相关的变量,‘a’确定一个组,而‘b’是一个布尔值,其值为TRUE(1)或FALSE(0)。我想创建一个变量‘c’,当‘b’至少一次为‘TRUE’时,所有组中的条目都是1,并且对于‘b’从未为TRUE的所有组中的条目,‘c’都是0。 如下所示:

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估计有关,在估计之前需要从数据集中删除未被选择的替代品。

4个回答

5
如果X是您的数据框。
library(dplyr)
X <- X %>%
  group_by(a) %>%
  mutate(c = any(b == 1))

3
一个基本的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)')

为什么在 b 上要使用双重否定? - Andreas
@Andreas 感谢您的评论,在这种情况下并不是真正需要的。 - akrun
1
谢谢,我使用了你的第一个建议,它很有效!通过这个例子,我学习了 ave() 函数,这对我来说是新的,所以非常有用! - olga

3

简单的data.table方法

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

虽然逻辑型和数值型(0-1)列在所有实际用途上都表现出相同的行为,但如果您想要数值结果,只需将对 any 的调用包装在 as.numeric 中即可。


1

使用基本的R语言回答,假设ab在数据框x中。

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

编辑以更改调用分割。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接