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

时间:2015-01-14 06:04:59

标签: 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

我想我不明白数据帧操作是如何工作的。

任何帮助都将不胜感激。

2 个答案:

答案 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))