修改两组行之间的所有字符串
Modify all the strings between two sets of rows
我目前正在处理几个包含 5570 个巴西城市信息的数据集,我经常需要按名称合并它们。但碰巧有几个名称在各州之间重复(在 UF: 行中命名)。一个数据集的例子是:
<chr>
1 UF: Alagoas
2 IBATEGUARA
3 MARAGOGI
4 MESSIAS
5 PENEDO
6 PORTO CALVO
7 UF: Amazonas
8 APUI
9 HUMAITA
10 MANAQUIRI
我想要的是区分每个自治市的状态:
<chr>
1 UF: Alagoas
2 IBATEGUARA (AL)
3 MARAGOGI (AL)
4 MESSIAS (AL)
5 PENEDO (AL)
6 PORTO CALVO (AL)
7 UF: Amazonas
8 APUI (AM)
9 HUMAITA (AM)
10 MANAQUIRI (AM)
有了这个,我每个地方都有一个唯一的名字。我尝试使用 mutate_at
并在每个状态标识符之间输入行,但我想要一种更简单的方法来跨不同的数据集执行此操作。如何修改两组行之间的所有字符串?
一个选项是根据 'UF' 字符串
的出现创建一个分组列
library(dplyr)
library(stringr)
df1 %>%
group_by(grp = cumsum(str_detect(col1, '^UF:\s+')) %>%
mutate(newcol = toupper(str_extract(first(col1), '(?<=UF: )\w{2}')),
col1 = case_when(row_number() > 1
~ sprintf('%s (%s)', col1, newcol), TRUE ~ col1)) %>%
ungroup %>%
select(col1)
我建议在新标签中创建新代码。此方法使用 tidyverse
函数和 base R
:
#Data
df <- structure(list(V1 = c("UF: Alagoas", "IBATEGUARA", "MARAGOGI",
"MESSIAS", "PENEDO", "PORTO CALVO", "UF: Amazonas", "APUI", "HUMAITA",
"MANAQUIRI")), class = "data.frame", row.names = c(NA, -10L))
代码:
我们检测模式 UF
:
#Detect UF
i1 <- df$V1[which(grepl('UF:',df$V1))]
i2 <- which(grepl('UF:',df$V1))
现在,我们创建并格式化标签:
#Format labels
labs <- gsub('UF: ','',i1,fixed = T)
labs <- toupper(substr(labs,1,2))
我们分配一个新变量来保存带有索引的标签:
#Create a new var and assign
df$Label <- NA
df$Label[i2] <- labs
我们完成变量:
#Now fill
df %>% fill(Label) -> df
我们准备变量以删除 UF
行:
#Remove UF
df$Label[i2] <- NA
最后,我们过滤数据集:
#Format dataset
df <- df[!is.na(df$Label),]
输出:
V1 Label
2 IBATEGUARA AL
3 MARAGOGI AL
4 MESSIAS AL
5 PENEDO AL
6 PORTO CALVO AL
8 APUI AM
9 HUMAITA AM
10 MANAQUIRI AM
我目前正在处理几个包含 5570 个巴西城市信息的数据集,我经常需要按名称合并它们。但碰巧有几个名称在各州之间重复(在 UF: 行中命名)。一个数据集的例子是:
<chr>
1 UF: Alagoas
2 IBATEGUARA
3 MARAGOGI
4 MESSIAS
5 PENEDO
6 PORTO CALVO
7 UF: Amazonas
8 APUI
9 HUMAITA
10 MANAQUIRI
我想要的是区分每个自治市的状态:
<chr>
1 UF: Alagoas
2 IBATEGUARA (AL)
3 MARAGOGI (AL)
4 MESSIAS (AL)
5 PENEDO (AL)
6 PORTO CALVO (AL)
7 UF: Amazonas
8 APUI (AM)
9 HUMAITA (AM)
10 MANAQUIRI (AM)
有了这个,我每个地方都有一个唯一的名字。我尝试使用 mutate_at
并在每个状态标识符之间输入行,但我想要一种更简单的方法来跨不同的数据集执行此操作。如何修改两组行之间的所有字符串?
一个选项是根据 'UF' 字符串
的出现创建一个分组列library(dplyr)
library(stringr)
df1 %>%
group_by(grp = cumsum(str_detect(col1, '^UF:\s+')) %>%
mutate(newcol = toupper(str_extract(first(col1), '(?<=UF: )\w{2}')),
col1 = case_when(row_number() > 1
~ sprintf('%s (%s)', col1, newcol), TRUE ~ col1)) %>%
ungroup %>%
select(col1)
我建议在新标签中创建新代码。此方法使用 tidyverse
函数和 base R
:
#Data
df <- structure(list(V1 = c("UF: Alagoas", "IBATEGUARA", "MARAGOGI",
"MESSIAS", "PENEDO", "PORTO CALVO", "UF: Amazonas", "APUI", "HUMAITA",
"MANAQUIRI")), class = "data.frame", row.names = c(NA, -10L))
代码:
我们检测模式 UF
:
#Detect UF
i1 <- df$V1[which(grepl('UF:',df$V1))]
i2 <- which(grepl('UF:',df$V1))
现在,我们创建并格式化标签:
#Format labels
labs <- gsub('UF: ','',i1,fixed = T)
labs <- toupper(substr(labs,1,2))
我们分配一个新变量来保存带有索引的标签:
#Create a new var and assign
df$Label <- NA
df$Label[i2] <- labs
我们完成变量:
#Now fill
df %>% fill(Label) -> df
我们准备变量以删除 UF
行:
#Remove UF
df$Label[i2] <- NA
最后,我们过滤数据集:
#Format dataset
df <- df[!is.na(df$Label),]
输出:
V1 Label
2 IBATEGUARA AL
3 MARAGOGI AL
4 MESSIAS AL
5 PENEDO AL
6 PORTO CALVO AL
8 APUI AM
9 HUMAITA AM
10 MANAQUIRI AM