【问题标题】:Generate new variable based on conditions根据条件生成新变量
【发布时间】:2020-12-09 05:46:49
【问题描述】:

所以我有这个带有州和年份信息的 df。我的目标是生成一个新变量 state_year,以便 1982 年的阿拉巴马州被分配一个 1,1983 年的阿拉巴马州被分配一个 2,1984 年的阿拉巴马州被分配一个 3,等等。

当我尝试以下操作时,我会在正确的情况下得到“TRUE”,但我希望它说“1”(然后在 1983 年为 AL 显示“2”,等等)。

test <- df %>%
    mutate(state_year = statefip == 1 & year == 1982)

【问题讨论】:

    标签: r dplyr tidyverse data-manipulation data-cleaning


    【解决方案1】:

    我们可以按“州”分组并通过在“statefip”、“年”上应用 rleid 来获取唯一 ID(假设列是有序的)

    library(data.table)
    setDT(df)[, state_year := rleid(statefip, year), state]
    

    dplyr

    library(dplyr)
    library(stringr)
    df %>%
        mutate(state_year = str_c(state_fip, year)) %>%
        group_by(state) %>%
        mutate(state_year = match(state_year, unique(state_year))
    

    【讨论】:

    • dplyr 版本正是我想要的。我对“唯一”代码不熟悉,将对此进行更多了解。谢谢!
    • 如果我还想尝试生成 state_year 以便每个州-年组合必须有一个唯一的代码,即没有两个可以有值 3。例如,1982 年的阿拉巴马州 = 1 1983 年的阿拉巴马州 = 2,1984 年的阿拉巴马州 = 4,1984 年的怀俄明州 = 52,等等。所以:50 个州 x 36 年 = 1,800 个值。
    • @AMB1274 这是我之前的回答。你可以做setDT(df)[, state_year := rleid(stateid, year)]
    【解决方案2】:

    对于每个state,您可以将年份转换为factor,然后再转换为integer,以获得唯一编号。

    library(dplyr)
    df %>%
      group_by(state) %>%
      mutate(state_year = as.integer(factor(year)))
    

    如果我们想为每个州-年组合设置唯一编号,我们可以将 stateyear 粘贴在一起,然后转换为 factor,然后再转换为 integer

    df %>%
      mutate(state_year = paste0(state, year), 
             state_year = as.integer(factor(state_year, levels = unique(state_year))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2013-04-15
      • 2023-02-25
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      相关资源
      最近更新 更多