r - 如何根据突发事件组合列?
问题描述
我有以下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
。但是,如果县是一位数或两位数,我希望它前面有零,例如001
and 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
有没有一种简短而优雅的方式来做到这一点?
解决方案
我们可以用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))
推荐阅读
- python - discord.py 更改文件大小以添加自定义表情符号
- java - JavaFX 图像未显示
- python - 返回一个数字的相反数的函数
- discord.py - Discord.py 奇怪的投注奖金问题
- vb.net - 如何在对象组合框中显示自定义 DisplayMember(即区域设置)
- php - 创建帖子时如何自动将特色图片添加到自定义帖子?
- java - JavaFX 嵌套 TableView 间距
- matlab - 创建一个迭代,从数组中选择 n 个元素进行计算,并为下一次迭代增加 n
- linux - 指定 Docker 在 Linux VM 上存储/放置文件的位置
- postgresql - 插入表时如何在 postgresql 中返回列值?