3

我想要一种简单的方法来创建一个新变量,以确定 R 数据框中的布尔值是否为真。这是示例:假设在数据集中我有 2 个变量(以及其他不相关的变量)“a”和“b”和“a”确定一个组,而“b”是一个布尔值,值为 TRUE (1)或假 (0)。我想创建一个变量“c”,对于“b”至少一次为“真”的组中的所有条目,它也是一个布尔值,为 1,对于“b”从不为真的组中的所有条目,它为 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

4 回答 4

3

如果X是你的数据框

library(dplyr)
X <- X %>%
  group_by(a) %>%
  mutate(c = any(b == 1))
于 2015-07-23T02:01:37.507 回答
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)')
于 2015-07-23T04:24:15.033 回答
3

简单的 data.table 方法

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

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

于 2015-07-23T04:27:17.773 回答
1

以 R 为基础的答案,假设a并且b在数据框中x

cvalue 是与 的一对一映射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

编辑以将呼叫更改为拆分。

于 2015-07-23T02:06:08.123 回答