首页 > 解决方案 > 使用 R 中现有列的前 3 个字母创建可以充当主键的列

问题描述

我有一张表,其中包含各种制造型号的车辆。我需要使用 make 列的前 3 个字母创建一个唯一键。

示例数据框:

> df <- data.frame(make = c('AUDI','AUDI','AUDI','FORD','FORD','FORD'), variant = c('A4','A6,','A8','EXPLORER','FIESTA','ENDEAVOUR'))
> df
  make   variant
1 AUDI        A4
2 AUDI       A6,
3 AUDI        A8
4 FORD  EXPLORER
5 FORD    FIESTA
6 FORD ENDEAVOUR
> df$ID <- paste(substr(df$make,1,3),rep(1:length(df$make)), sep = '')
> df
  make   variant   ID
1 AUDI        A4 AUD1
2 AUDI       A6, AUD2
3 AUDI        A8 AUD3
4 FORD  EXPLORER FOR4
5 FORD    FIESTA FOR5
6 FORD ENDEAVOUR FOR6
> 

预期输出:

> df
  make   variant   ID
1 AUDI        A4 AUD1
2 AUDI       A6, AUD2
3 AUDI        A8 AUD3
4 FORD  EXPLORER FOR1
5 FORD    FIESTA FOR2
6 FORD ENDEAVOUR FOR3
> 

我不知道如何更改 ID 列中每个品牌的编号。有人可以让我知道该怎么做吗?

标签: rdataframe

解决方案


我们可以在每个中生成行号make并将其与前 3 个字符一起粘贴到make.

library(dplyr)
df %>% group_by(make) %>% mutate(ID = paste0(substr(make, 1, 3), row_number()))

#  make  variant   ID   
#  <fct> <fct>     <chr>
#1 AUDI  A4        AUD1 
#2 AUDI  A6,       AUD2 
#3 AUDI  A8        AUD3 
#4 FORD  EXPLORER  FOR1 
#5 FORD  FIESTA    FOR2 
#6 FORD  ENDEAVOUR FOR3 

或在基础 R 中:

with(df, paste0(substr(make, 1, 3), ave(seq_along(make), make, FUN = seq_along)))
#[1] "AUD1" "AUD2" "AUD3" "FOR1" "FOR2" "FOR3"

推荐阅读