在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