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))
问题:
我想在 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))