问题:
我想在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
我想我不明白数据帧操作是如何工作的。
任何帮助都将不胜感激。
答案 0 :(得分:2)
尝试类似
的内容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"]
}
答案 1 :(得分:2)
以下是使用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))