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

时间:2015-07-23 01:48:58

标签: r boolean mlogit

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

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
-----------

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

calc()

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

4 个答案:

答案 0 :(得分:2)

基础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)')

答案 1 :(得分:2)

简单数据。表格方法

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

尽管逻辑和数字(0-1)列的行为与所有意图和目的相同,但如果您想要一个数字结果,您可以简单地将调用包裹在any as.numeric。< / p>

答案 2 :(得分:1)

如果X是您的数据框

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

答案 3 :(得分: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

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