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

在R中的面板数据中创建指示器变量,r,panel,R,Panel,我觉得这应该是容易的,但有点不知所措,希望你们都能帮上忙。我有面板数据,通过id和变量,这里就是v1: id v1 A 14 A 15 B 12 B 13 B 14 C 11 C 12 C 13 D 14 我只想创建一个虚拟变量,指示id的面板中是否存在v1(比如12)的值。比如: 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

我觉得这应该是容易的,但有点不知所措,希望你们都能帮上忙。我有面板数据,通过
id
和变量,这里就是
v1

id  v1
A   14
A   15
B   12
B   13
B   14 
C   11
C   12 
C   13
D   14
我只想创建一个虚拟变量,指示
id
的面板中是否存在
v1
(比如
12
)的值。比如:

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
我觉得这应该是简单的,但不能想出一个简单的单线解决方案

非常感谢

试试看

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
切换到
0
s和
1
s

另一种方法是使用
ave

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

或者
setDT(df)[,v2:=any(v1==12)+0L,id]
使用
library(data.table
)或者使用
ave
是否有任何理由想要0和1而不是F/T?此外,使用
+0L
比使用
快,因为.integer
或更简洁?@MichaelChirico 0s和1s用于匹配OP所需的输出。我不知道他对此是否有特殊目的。关于
+0L
as.numeric
两者在速度方面应该相当。好的,只是看看样式背后是否有实质内容。我的基准测试表明,
as.integer
对于大向量胜出,但是对于10000个长度的向量,胜出的幅度是微秒。
#  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