在面板数据框中生成满足同一个人条件的虚拟变量

时间:2019-05-25 12:29:51

标签: r

我有这种形式的数据框

ID panelid dummy1 dummy2
1  1       0      1
1  2       1      0
2  1       1      0
2  2       0      1
3  1       1      0
3  2       1      0
4  1       0      1
4  2       0      1

我要在panelid == 2发生且仅当同一个人在panelid == 1中提供dummy1等于1且在panelid == 1中产生dummy2等于1的情况下才生成等于1的哑变量。 panelid == 2。因此我想获得这样的东西

    ID panelid dummy1 dummy2 result
    1  1       0      1      0
    1  2       1      0      0
    2  1       1      0      0
    2  2       0      1      1
    3  1       1      0      0
    3  2       1      0      0
    4  1       0      1      0
    4  2       0      1      0

有人可以帮我吗?

非常感谢大家

2 个答案:

答案 0 :(得分:1)

这几乎与@Cole的解决方案相同。

dataset <- read.table(text = 'ID panelid dummy1 dummy2
1  1       0      1
1  2       1      0
2  1       1      0
2  2       0      1
3  1       1      0
3  2       1      0
4  1       0      1
4  2       0      1',
                      header = TRUE)

temp_ID <- dataset$ID[(dataset$panelid == 1) & (dataset$dummy1 == 1)]
dataset$result <- as.integer(x = ((dataset$panelid == 2) & (dataset$dummy2 == 1) & (dataset$ID %in% temp_ID)))

dataset

  ID panelid dummy1 dummy2 result
1  1       1      0      1      0
2  1       2      1      0      0
3  2       1      1      0      0
4  2       2      0      1      1
5  3       1      1      0      0
6  3       2      1      0      0
7  4       1      0      1      0
8  4       2      0      1      0

答案 1 :(得分:0)

这是基本的R方法:

dummy1_in_panelid <- with(df, ID[panelid == 1 & dummy1 == 1])

#initialize
df$result <- 0

df$result[with(df, which(panelid == 2 & ID %in% dummy1_in_panelid & dummy2 == 1))] <- 1
df

  ID panelid dummy1 dummy2 result
1  1       1      0      1      0
2  1       2      1      0      0
3  2       1      1      0      0
4  2       2      0      1      1
5  3       1      1      0      0
6  3       2      1      0      0
7  4       1      0      1      0
8  4       2      0      1      0

还有数据...

df <- as.data.frame(data.table::fread('
ID panelid dummy1 dummy2
1  1       0      1
1  2       1      0
2  1       1      0
2  2       0      1
3  1       1      0
3  2       1      0
4  1       0      1
4  2       0      1'))