r 中分类变量 (id) 的每个第一次观察的虚拟变量

Dummy variable for each first observation of a categorical variable (id) in r

问题: 我想在 R 中创建一个虚拟变量 first 如果另一个虚拟变量的值从 0 变为 1,则它是 1,条件是它不是对 id 号的第一次观察。这背后的问题是我想识别在面板设置中观察到的时间段内进入市场的公司。

作为一个例子,我尝试用一​​个小样本集创建这个:

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

我想我不明白数据帧操作的真正工作原理。

如有任何帮助,我们将不胜感激。

试试

df$first <- df$id == c(NA, df$id[-nrow(df)]) & 
            df$dummy > c(1, df$dummy[-nrow(df)]) 

给予

> df
  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

如果您想要类似您的函数的东西,请考虑

first.dum <- function(x) { 
    y <- rbind(c(NA,1),x[-nrow(x),]) 
    x[,"id"] == y[,"id"] & x[,"dummy"] > y[,"dummy"]
    }

下面是我将如何使用 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))