我觉得这应该很容易,但不知所措,并希望你们都能提供帮助.我有面板数据,通过id变量,这里只是v1:
id v1
A 14
A 15
B 12
B 13
B 14
C 11
C 12
C 13
D 14
Run Code Online (Sandbox Code Playgroud)
我只想创建一个虚拟变量,指示面板中是否存在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
Run Code Online (Sandbox Code Playgroud)
我觉得这应该很简单,但无法弄清楚一个简单的一线解决方案.
非常感谢!
尝试
library(dplyr)
df %>% group_by(id) %>% mutate(v2 = as.numeric(any(v1 == 12)))
Run Code Online (Sandbox Code Playgroud)
或者按照@akrun的建议:
library(data.table)
setDT(df)[, v2 := any(v1 ==12)+0L, id]
Run Code Online (Sandbox Code Playgroud)
注意:添加0L到创建的逻辑值any()将切换TRUE/FALSE到0s和1s.
另一种方法可能是使用ave:
df$v2 <- with(df, ave(v1, id, FUN = function(x) any(x == 12)))
Run Code Online (Sandbox Code Playgroud)
这使:
# 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
Run Code Online (Sandbox Code Playgroud)