簡體   English   中英

如何根據突發事件組合列?

[英]How to combine columns based on contingencies?

我有以下 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

我想根據列statecounty創建一個名為CODE的新列。 我想將state的號碼粘貼到county的號碼中。 但是,如果縣是一位數或兩位數,我希望它前面有零,例如001033

理想情況下,最終的 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

有沒有一種簡短而優雅的方式來做到這一點?

我們可以使用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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM