如何解决修改两组行之间的所有字符串
我目前正在处理包含有关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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。