为 R 数据帧中的每个实例更新字符串行内的整数

问题描述 投票:0回答:1

我有一个类似于以下可重现的数据框,其中一列包含 HTML 代码:

ID <- c(15, 25, 90, 1, 23, 543)

HTML <- c("[demography_form][1]<div></table<text-align>[demography_form_date][1]", "<text-ali>[geography_form][1]<div></table<text-align>[geography_form_date][1]", "[social_isolation][1]<div></table<div><text-align>[social_isolation_date][1]", "<text-align>[geography_form][1]<div></table<text-align>[geography_form_date][1]", "<div>[demography_form][1]<div></table<text-align>[demography_form_date][1]", "[geography_form][1]<div></table<text-align>[geography_form_date][1]</table")

df <- data.frame(ID, HTML)

我想更新

HTML
列方括号内的整数以反映重复的每个实例。例如,[demography_form] 第二次出现在一行中,我希望它后面的方括号是 2:

执行此操作的最佳方法是什么?我正在考虑以某种方式创建一个实例列,然后使用它来更新方括号中的值,最后删除它?提前致谢。

r string dataframe dplyr instance
1个回答
1
投票

[]
from HTML 列中的子字符串创建分组列,使用
[]
row_number()
 中的数字替换为行序列 (
str_replace_all

)
library(dplyr)
library(stringr)
df %>% 
  group_by(grp = str_extract(HTML, "\\[(\\w+)\\]", group =1)) %>% 
  mutate(HTML = str_replace_all(HTML, "\\[(\\d+)\\]", 
     sprintf("[%d]", row_number()))) %>% 
  ungroup %>%
  select(-grp)

-输出

# A tibble: 6 × 2
     ID HTML                                                                           
  <dbl> <chr>                                                                          
1    15 [demography_form][1]<div></table<text-align>[demography_form_date][1]          
2    25 <text-ali>[geography_form][1]<div></table<text-align>[geography_form_date][1]  
3    90 [social_isolation][1]<div></table<div><text-align>[social_isolation_date][1]   
4     1 <text-align>[geography_form][2]<div></table<text-align>[geography_form_date][2]
5    23 <div>[demography_form][2]<div></table<text-align>[demography_form_date][2]     
6   543 [geography_form][3]<div></table<text-align>[geography_form_date][3]</table     
© www.soinside.com 2019 - 2024. All rights reserved.