r - 通过定界符将字符分隔成假定固定宽度的向量

标签 r regex tidyverse tidyr

我有以下字符数据,

v1 <- c("1321-56, 21-, 15-, 1701-13,", "1305-25, 2101-03, 1501-02, 1711-55,", "1309-18, 21-, 1501-04, 1701-15,")
data <- data.frame(v1)
> data
                                   v1
1         1321-56, 21-, 15-, 1701-13,
2 1305-25, 2101-03, 1501-02, 1711-55,
3     1309-18, 21-, 1501-04, 1701-15,

以逗号分隔,字符行的每一部分都被分成3部分。字符数应分别为 2、5 和 6。例如,

  • 1321-56 应分配到三个向量中,如 13(2 个字符)、00021(5 个字符)和 000056 (6 个字符)。
  • 15- 应该分布到三个向量中,如 15、00000000000。等

最终的输出应该是这样的,

> data1
  v1a   v1b    v1c v2a   v2b    v2c v3a   v3b    v3c v4a   v4b    v4c
1  13 00021 000056  21 00001 000000  15 00000 000000  17 00001 000013
2  13 00005 000025  21 00001 000003  15 00000 000000  17 00011 000055
3  13 00009 000018  21 00000 000000  15 00000 000000  17 00001 000015

知道怎么做吗?

最佳答案

这是一个分两步的方法,使用 str_matchsprintf。首先我们拆分所有内容:

n <- 4 # or str_count(v1, ",")[1] of it's common to all the rows
(M <- str_match(v1, paste0(rep("(\\d{2})(\\d*)-(\\d*)[, ]*", n), collapse = ""))[, -1])
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,] "13" "21" "56" "21" ""   ""   "15" ""   ""   "17"  "01"  "13" 
# [2,] "13" "05" "25" "21" "01" "03" "15" "01" "02" "17"  "11"  "55" 
# [3,] "13" "09" "18" "21" ""   ""   "15" "01" "04" "17"  "01"  "15" 

给出 3 * n 列,然后用 sprintf 格式化矩阵:

matrix(sprintf(c("%02s", "%05s", "%06s"), t(M)), nrow = nrow(M), byrow = TRUE)
#      [,1] [,2]    [,3]     [,4] [,5]    [,6]     [,7] [,8]    [,9]     [,10] [,11]   [,12]   
# [1,] "13" "00021" "000056" "21" "00000" "000000" "15" "00000" "000000" "17"  "00001" "000013"
# [2,] "13" "00005" "000025" "21" "00001" "000003" "15" "00001" "000002" "17"  "00011" "000055"
# [3,] "13" "00009" "000018" "21" "00000" "000000" "15" "00001" "000004" "17"  "00001" "000015"

关于r - 通过定界符将字符分隔成假定固定宽度的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54277802/

相关文章:

r - 在 ggplot 中设置多个绘图的轴

asp.net - 如何使用R登录然后从aspx网页下载文件

用于匹配嵌套括号内的特定文本的 C# 正则表达式

regex - 如何正确预期多个提示

r - 使用 purrr 将计数序列添加到 R 中的嵌套数据帧

R 通过列嵌套映射

r - 省略某些值时如何创建桑基图

r - Bookdown gitbook 只生成 1 页(无法导航查看其他页面)

regex - 使用 find 和正则表达式查找以月份数字开头的文件名

r - 根据类似名称的列中的值将值赋予新列