【问题标题】:How to Create Conditional Dummy Variables (Panel Data) in R?如何在 R 中创建条件虚拟变量(面板数据)?
【发布时间】:2022-01-23 12:11:41
【问题描述】:

我的面板数据由两波组成:18 和 21。我的就业状态有 4 个值。

如果该人在两个波中都受雇,我想创建一个取值 1 的虚拟变量,否则为零。但是,我失败的代码生成了一个只有零值的虚拟对象:

df$dummy <- df %>%
  group_by(NEW_id) %>%
  arrange(New_id, WAVE_NO) %>%
  mutate(dummy = case_when(WAVE_NO==18 & WAVE_NO==21 & EMPLOYMENT_STATUS=="Employed" ~ 1, TRUE ~ 0))

【问题讨论】:

  • WAVE_NO==18 &amp; WAVE_NO==21 正在同时搜索 18 和 21。你的意思是WAVE_NO==18 | WAVE_NO==21 吗?

标签: r statistics dummy-variable


【解决方案1】:

我们可能会使用split 将数据框拆分为id。由于split 返回一个列表,我们可以使用lapply 对该列表的每个元素执行一些操作(这里:创建虚拟变量)。 lapply 的输出也将是一个列表。然而,我们想要一个data.frame,所以我们调用do.call(),它同时对列表的所有元素执行一些操作(这里:rbind)。

set.seed(1)

n <- 10L
K <- 2L
df <- data.frame(
  id = rep(1L:n, each=K),
  wave = rep(c(18L,21L), n),
  employment = sample(c('Employed', 'Unemployed'), n*K, replace = TRUE)
)

# add dummy to data frame
df <- do.call(rbind, lapply(split(df, df$id), function(x) {
  x$dummy <- ifelse(x$employment %in% 'Employed', 1L, 0L)
  x$dummy <- ifelse(sum(x$dummy) == 2L, 1L, 0L)
  return(x)
}))
rownames(df) <- NULL

输出

> head(df)
  id wave employment dummy
1  1   18   Employed     0
2  1   21 Unemployed     0
3  2   18   Employed     1
4  2   21   Employed     1
5  3   18 Unemployed     0
6  3   21   Employed     0

【讨论】:

    【解决方案2】:
    df <- data.frame(
      stringsAsFactors = FALSE,
      id = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L),
      wave = c(18L, 21L, 18L, 21L, 18L, 21L, 18L, 10L, 18L, 21L),
      EMPLOYMENT_STATUS = c(
        "Employed",
        "Employed",
        "unemployed",
        "Employed",
        "unemployed",
        "Employed",
        "Employed",
        "Employed",
        "unemployed",
        "unemployed"
      )
    )
    
    library(tidyverse)
    df %>%
      group_by(id) %>%
      mutate(dummy = +(all(wave %in% c(18, 21)) &
                         all(EMPLOYMENT_STATUS == "Employed"))) %>%
      ungroup()
    #> # A tibble: 10 x 4
    #>       id  wave EMPLOYMENT_STATUS dummy
    #>    <int> <int> <chr>             <int>
    #>  1     1    18 Employed              1
    #>  2     1    21 Employed              1
    #>  3     2    18 unemployed            0
    #>  4     2    21 Employed              0
    #>  5     3    18 unemployed            0
    #>  6     3    21 Employed              0
    #>  7     4    18 Employed              0
    #>  8     4    10 Employed              0
    #>  9     5    18 unemployed            0
    #> 10     5    21 unemployed            0
    

    reprex package (v2.0.1) 于 2022-01-23 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2016-06-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 2013-09-23
      • 2020-04-03
      • 1970-01-01
      相关资源
      最近更新 更多