regex - R中按字母/字符数拆分列标签

标签 regex r split multiple-columns

我有一个大型数据集,其中所有列标题都是单独的 IDS,每个 IDS 长度为 8 个字符。我想将这些单独的 ID 分成 2 行,其中第一行 ID 包含前 7 个字符,第二行仅包含最后一个字符。

当前数据集:

ID1:    Indiv01A    Indiv01B    Indiv02A    Indiv02B    Speci03A    Speci03B

预期数据集:

ID1:    Indiv01 Indiv01 Indiv02 Indiv02 Speci03 Speci03  
ID2:    A   B   A   B   A   B

我浏览了有关拆分数据的其他帖子,但它们似乎都有一种独特的方式来分隔列名称(即:有一个逗号分隔两个组成部分,或一个句点)。

这是我认为效果最好的代码,但我只是不知道如何编码“7 个字符”作为分割点,而不是逗号:

sapply(strsplit(as.character(d$ID), ",")

如有任何帮助,我们将不胜感激。

最佳答案

这是一个解决方案的正则表达式 strsplit 。它将字符串拆分为第 7 个和第 8 个字符:

ID1 <- c("Indiv01A", "Indiv01B", "Indiv02A", "Indiv02B", "Speci03A", "Speci03B")

res <- strsplit(ID1, "(?<=.{7})", perl = TRUE)

# [[1]]
# [1] "Indiv01" "A"      
# 
# [[2]]
# [1] "Indiv01" "B"      
# 
# [[3]]
# [1] "Indiv02" "A"      
# 
# [[4]]
# [1] "Indiv02" "B"      
# 
# [[5]]
# [1] "Speci03" "A"      
# 
# [[6]]
# [1] "Speci03" "B"  

现在,您可以使用rbind创建两列:

do.call(rbind, res)
#      [,1]      [,2]
# [1,] "Indiv01" "A" 
# [2,] "Indiv01" "B" 
# [3,] "Indiv02" "A" 
# [4,] "Indiv02" "B" 
# [5,] "Speci03" "A" 
# [6,] "Speci03" "B" 
<小时/>

正则表达式模式的说明:

(?<=.{7})

(?<=)是一个(积极的)回顾。它匹配指定模式前面的任何位置。这里,模式是 .{7} 。点 ( . ) 匹配任何字符。 {7}表示7次。因此,正则表达式匹配前面正好 7 个字符的位置。

关于regex - R中按字母/字符数拆分列标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21959930/

相关文章:

单撇号之间的Python正则表达式findall()子串

python - 使用\w+ 在正则表达式搜索中包含 '-'。 Python

删除R中一组内所有零值的行

c# - 如何将字符串拆分为字典<string,string>

java - 分割字符串,忽略括号包围的组

perl - 使用perl检测汉字?

正则表达式 - 查找所有不以特定前缀开头的匹配词

regex - 在正则表达式中使用替换比后续替换更快吗?

r - 使用 lapply 制作函数列表

r - 从 .onLoad 包函数中调用 getNamespaceExports()