我想要一种简单的方法来创建一个新变量,以确定在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估计,其中从未选择的替代方案需要在估算之前从数据集中删除。
答案 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的答案,假设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
编辑以将调用更改为拆分。