通过 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))
假设 a
和 b
在数据帧 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
的调用.
我想要一种简单的方法来创建一个新变量来确定布尔值在 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))
假设 a
和 b
在数据帧 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
编辑以将调用更改为拆分。
基础 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
的调用.