R 根据条件生成新变量

R 根据条件生成新变量,r,dplyr,tidyverse,data-manipulation,data-cleaning,R,Dplyr,Tidyverse,Data Manipulation,Data Cleaning,所以我有一个状态和年份信息的df。我的目标是生成一个新变量,state\u year,以便1982年的阿拉巴马州被分配为1,1983年的阿拉巴马州被分配为2,1984年的阿拉巴马州被分配为3,以此类推 当我尝试下面的方法时,对于正确的情况,我得到了“TRUE”,但我希望它说“1”(然后在1983年,AL得到了2,以此类推) test% 变异(州年=statefip==1年=1982年) 我们可以按“state”分组,并通过在“statefip”、“year”上应用rleid获得唯一的ID(假设

所以我有一个状态和年份信息的df。我的目标是生成一个新变量,state\u year,以便1982年的阿拉巴马州被分配为1,1983年的阿拉巴马州被分配为2,1984年的阿拉巴马州被分配为3,以此类推

当我尝试下面的方法时,对于正确的情况,我得到了“TRUE”,但我希望它说“1”(然后在1983年,AL得到了2,以此类推)

test%
变异(州年=statefip==1年=1982年)

我们可以按“state”分组,并通过在“statefip”、“year”上应用
rleid
获得唯一的ID(假设列已排序)


或使用
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))

我们可以按“state”分组,并通过在“statefip”、“year”上应用
rleid
来获得唯一的ID(假设列已排序)


或使用
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))

对于每个
状态
,您可以将年份转换为
因子
,然后再转换为
整数
,以获得唯一的数字

library(dplyr)
df %>%
  group_by(state) %>%
  mutate(state_year = as.integer(factor(year)))
如果我们想为每个州年组合设置唯一的编号,我们可以将
粘贴在一起,然后转换为
因子
,然后再转换为
整数

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

对于每个
状态
,您可以将年份转换为
因子
,然后再转换为
整数
,以获得唯一的数字

library(dplyr)
df %>%
  group_by(state) %>%
  mutate(state_year = as.integer(factor(year)))
如果我们想为每个州年组合设置唯一的编号,我们可以将
粘贴在一起,然后转换为
因子
,然后再转换为
整数

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

dplyr版本正是我想要的。我不熟悉“unique”代码,将进一步了解这一点。非常感谢。如果我还想尝试生成state_year,这样每个state year组合都必须有一个唯一的代码,也就是说,任何两个组合的值都不能为3。例如,1982年的阿拉巴马州=1,1983年的阿拉巴马州=2,1984年的阿拉巴马州=4,1984年的怀俄明州=52,等等。所以:50个州x 36年=1800个值。@AMB1274这是我之前的答案。你可以只做
setDT(df)[,state_year:=rleid(stateid,year)]
dplyr版本正是我想要的。我不熟悉“unique”代码,将进一步了解这一点。非常感谢。如果我还想尝试生成state_year,这样每个state year组合都必须有一个唯一的代码,也就是说,任何两个组合的值都不能为3。例如,1982年的阿拉巴马州=1,1983年的阿拉巴马州=2,1984年的阿拉巴马州=4,1984年的怀俄明州=52,等等。所以:50个州x 36年=1800个值。@AMB1274这是我之前的答案。您只需执行
setDT(df)[,state_year:=rleid(stateid,year)]