首页 > 解决方案 > 如何根据突发事件组合列?

问题描述

我有以下df:

SUMLEV STATE COUNTY AGEGRP TOT_POP TOT_MALE
50     1      1    0   55601    26995
50     7      33   0  218022   105657
50     14     500  0   24881    13133
50     4      70   0   22400    11921
50     3      900  0   57840    28500
50     22     11   0   10138     5527

我想创建一个CODE基于列state和命名的新列county。我想将数字从粘贴state到数字从county。但是,如果县是一位数或两位数,我希望它前面有零,例如001and 033

理想情况下,最终的 df 看起来像:

SUMLEV STATE COUNTY AGEGRP TOT_POP TOT_MALE CODE
50     1      1    0   55601    26995     1001
50     7      33   0  218022   105657     7033
50     14     500  0   24881    13133     14500
50     4      70   0   22400    11921     4070
50     3      900  0   57840    28500     3900
50     22     11   0   10138     5527     22011

有没有一种简短而优雅的方式来做到这一点?

标签: rdataframe

解决方案


我们可以用sprintf

library(dplyr)
df %>%
    mutate(CODE = sprintf('%d%03d', STATE, COUNTY))
# SUMLEV STATE COUNTY AGEGRP TOT_POP TOT_MALE  CODE
#1     50     1      1      0   55601    26995  1001
#2     50     7     33      0  218022   105657  7033
#3     50    14    500      0   24881    13133 14500
#4     50     4     70      0   22400    11921  4070
#5     50     3    900      0   57840    28500  3900
#6     50    22     11      0   10138     5527 22011

如果我们需要将“CODE”列一分为二,我们可以使用separate

library(tidyr)
df %>%
    mutate(CODE = sprintf('%d%03d', STATE, COUNTY)) %>% 
    separate(CODE, into = c("CODE1", "CODE2"), sep= "(?=...$)")

或者extract将子字符串捕获为一个组

df %>%
    mutate(CODE = sprintf('%d%03d', STATE, COUNTY)) %>% 
    extract(CODE, into = c("CODE1", "CODE2"), "^(.*)(...)$")

或与str_pad

library(stringr)
df %>%
    mutate(CODE = str_c(STATE, str_pad(COUNTY, width = 3, pad = '0')))

或在base R

df$CODE <- sprintf('%d%03d', df$STATE, df$COUNTY)

数据

df <- structure(list(SUMLEV = c(50L, 50L, 50L, 50L, 50L, 50L), STATE = c(1L, 
7L, 14L, 4L, 3L, 22L), COUNTY = c(1L, 33L, 500L, 70L, 900L, 11L
), AGEGRP = c(0L, 0L, 0L, 0L, 0L, 0L), TOT_POP = c(55601L, 218022L, 
24881L, 22400L, 57840L, 10138L), TOT_MALE = c(26995L, 105657L, 
13133L, 11921L, 28500L, 5527L)), class = "data.frame", row.names = c(NA, 
-6L))

推荐阅读