我有以下字符数据,
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、00000
和000000
。等
最终的输出应该是这样的,
> 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_match
和 sprintf
。首先我们拆分所有内容:
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/