在R中创建面板数据中的指标变量

3

我觉得这应该很简单,但是我还是不知所措,希望你们能帮助。我的面板数据按照id分类,并且包含变量,这里只有一个v1

id  v1
A   14
A   15
B   12
B   13
B   14 
C   11
C   12 
C   13
D   14

我想要创建一个哑变量,指示v1的值(比如12)是否存在于id面板中。希望类似于以下形式:

id  v1  v2
A   14  0
A   15  0 
B   12  1
B   13  1
B   14  1 
C   11  1
C   12  1 
C   13  1
D   14  0

我觉得这应该很简单,但是无法想出一个简单的一行解决方案。

非常感谢!

1个回答

6

尝试

library(dplyr)
df %>% group_by(id) %>% mutate(v2 = as.numeric(any(v1 == 12)))

根据@akrun的建议,或者说:
library(data.table)
setDT(df)[, v2 := any(v1 ==12)+0L, id]

注意:将0L添加到any()创建的逻辑值中,将会把TRUE/FALSE转换为01

另一种方法是使用ave

df$v2 <- with(df, ave(v1, id, FUN = function(x) any(x == 12)))

这将会得到:

#  id v1 v2
#1  A 14  0
#2  A 15  0
#3  B 12  1
#4  B 13  1
#5  B 14  1
#6  C 11  1
#7  C 12  1
#8  C 13  1
#9  D 14  0

1
或者使用 library(data.table) 中的 setDT(df)[, v2 := any(v1 ==12)+0L, id] 或者使用 ave - akrun
1
想要0和1而不是F/T,有什么原因吗?此外,使用+0L比使用as.integer更快,还是只是更简洁? - MichaelChirico
@MichaelChirico 使用0和1来匹配OP所需的输出。我不知道他是否有特定的目的。关于+0Las.numeric,它们在速度方面应该是相当等效的。 - Steven Beaupré
1
好的,只是检查一下是否有一些实质性的东西支撑这种风格。我的基准测试表明,在大向量方面,as.integer胜出,但在长度为10000的向量的微秒级别上。 - MichaelChirico

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