问题:
我想在 R 中创建一个虚拟变量 first
,如果另一个虚拟变量的值从 0 变为 1,并且它不是 id 编号的第一个观察值,则该变量为 1。这背后的问题是,我想识别在面板设置中观察的时间段内进入市场的公司。
作为一个例子,我尝试用一个小样本集创建这个:
id <- c(1,1,1,2,2,3,3,3)
dummy <- c(0,1,1,0,1,1,0,1)
df <- data.frame(id,dummy)
df[,"id"]
first.dum <- function(x)
c( x[-1,"id"] == x[,"id"]
& x[-1,"dummy"] != x[,"dummy"]
& x[,"dummy"] == "1")
df$first <- first.dum(df)
df
结果就像......
id dummy first
1 1 0 FALSE
2 1 1 FALSE
3 1 1 FALSE
4 2 0 FALSE
5 2 1 FALSE
6 3 1 TRUE
7 3 0 FALSE
8 3 1 FALSE
我想我不明白数据帧操作的真正工作原理。
如有任何帮助,我们将不胜感激。
最佳答案
这是我使用data.table
包来解决这个问题的方法
library(data.table)
setDT(df)[, first := c(0, diff(dummy)) == 1, id][]
# id dummy first
# 1: 1 0 FALSE
# 2: 1 1 TRUE
# 3: 1 1 FALSE
# 4: 2 0 FALSE
# 5: 2 1 TRUE
# 6: 3 1 FALSE
# 7: 3 0 FALSE
# 8: 3 1 TRUE
基本上,我们按组检查dummy
是否比之前的观察值大一(从第二个观察值开始)。
您可以使用dplyr
进行类似的操作
library(dplyr)
df %>% group_by(id) %>% mutate(first = c(0, diff(dummy)) == 1)
或者使用基本 R
unlist(tapply(df$dummy, df$id, function(x) c(0, diff(x)) == 1))
关于r - r 中分类变量 (id) 的每个第一次观察的虚拟变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27936739/