【问题标题】:Creating a binary variable if individual was observed in the previous year如果在前一年观察到个人,则创建一个二元变量
【发布时间】:2022-11-22 04:32:35
【问题描述】:

假设我有一个以下格式的示例数据框:

df <- data.frame( c(1,2,3,1,2,3,1,2,3),
                  c(3,3,3,2,2,2,1,1,1),
                  c(23,23,34,134,134,NA,45,NA,NA)
)
colnames(df) <- c("id", "year", "fte_wage")

df <- df[is.na(df$fte_wage) == FALSE,]

我想创建一个二进制变量(比方说,一个名为“obs”的列)是否在之前观察到个人。我尝试了以下方法:

library(dplyr)
df2 <- 
  df %>% 
  arrange(id, year) %>%
  group_by(id) %>% 
  rowwise() %>%
  mutate(obs = ifelse((lag(year) %in% df[df$id == id,]$year & year > lag(year)), 1, 0))

它生成一列只有 0 个值。如果我删除第二个条件,代码可以工作,但它会误解 lag(year) 命令,因为它也从不同的个人那里获取值。

我想要的输出将是以下格式的数据框:

id year fte_wage ob
1 1 23 0
1 2 23 1
1 3 43 1
2 1 54 0
2 2 32 1
3 1 56 0

【问题讨论】:

  • 你能清楚地解释你想做什么吗?
  • 是 - 期望的输出是什么?另外 rowwise() 也是一个分组函数,所以它会覆盖上一行的分组,并将每一行单独分组,所以它只会返回 NAlag() 函数。

标签: r dataframe dplyr


【解决方案1】:

你可以只group_by(id),然后检查row_number()是否是&gt; 1,看看它是重复运行还是单独运行。

library(tidyverse)

df <- data.frame("id" = c(1,2,3,1,2,3,1,2,3),
                 "year" = c(3,3,3,2,2,2,1,1,1),
                  "fte_wage" = c(23,23,34,134,134,NA,45,NA,NA))

df %>% 
  drop_na(fte_wage) %>% 
  arrange(id, year) %>%
  group_by(id) %>% 
  mutate(obs = as.numeric(row_number() > 1))
#> # A tibble: 6 × 4
#> # Groups:   id [3]
#>      id  year fte_wage   obs
#>   <dbl> <dbl>    <dbl> <dbl>
#> 1     1     1       45     0
#> 2     1     2      134     1
#> 3     1     3       23     1
#> 4     2     2      134     0
#> 5     2     3       23     1
#> 6     3     3       34     0

创建于 2022-11-21 reprex v2.0.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多