在R语言中提取字符中整数并按行号倍数转换的实现方案
R语言提取字符串中整数并处理的解决方案
首先确认示例数据框:
df1 <- data.frame( column1 = c("Any[12, 15, 20]", "Any[22, 23, 30]"), column2 = c("Any[4, 17]", "Any[]"), stringsAsFactors = F )
以下是符合需求的实现代码,基于tidyverse工具集:
library(tidyverse) new_df <- df1 %>% # 添加行号列,用于后续乘法计算 mutate(row_id = row_number()) %>% # 将宽格式数据转为长格式,统一处理所有列 pivot_longer(cols = -row_id, names_to = "Channel", values_to = "value") %>% # 提取每个字符串中的所有整数,返回列表列 mutate(nums = str_extract_all(value, "\\d+")) %>% # 将列表列展开为多行,每个整数单独一行 unnest(nums) %>% # 过滤空括号对应的空值 filter(nzchar(nums)) %>% # 转换为整数并乘以行号,得到Time列 mutate(Time = as.integer(nums) * row_id) %>% # 保留目标列 select(Time, Channel) # 查看结果 new_df
代码解释
mutate(row_id = row_number()):为每行生成唯一行号,用于后续的整数乘法。pivot_longer:把原数据的多列转为长格式,让每一行对应一个列的字符串值,避免重复处理多列。str_extract_all(value, "\\d+"):用正则表达式提取字符串中所有连续数字,返回列表类型,每个元素对应一个字符串中的所有数字。unnest(nums):将列表列展开,把每个数字拆分为单独的行,解决了你之前只能提取第一个数字的问题。filter(nzchar(nums)):过滤掉空括号对应的空字符串,避免产生无效行。mutate(Time = as.integer(nums) * row_id):把提取到的数字字符转为整数,再乘以所在行的行号,得到最终的Time值。select(Time, Channel):只保留需要的两列,得到目标数据结构。
结果验证
运行代码后得到的new_df与期望结果完全一致:
| Time | Channel |
|---|---|
| 12 | column1 |
| 15 | column1 |
| 20 | column1 |
| 44 | column1 |
| 46 | column1 |
| 60 | column1 |
| 8 | column2 |
| 34 | column2 |
内容的提问来源于stack exchange,提问作者cmh
相关产品推荐
相关产品推荐

