【问题标题】:Split text string in a data.table columns by location按位置拆分 data.table 列中的文本字符串
【发布时间】:2017-07-24 20:54:23
【问题描述】:

我试图弄清楚如何使用tstrisplit() 函数从data.tablesplit 位置编号 的文本。我知道Q1Q2Q3,但这些并不能解决我的问题。

举个例子:

 DT2 <- data.table(a = paste0(LETTERS[1:5],seq(10,15)), b = runif(6))
 DT2
     a         b  
1: A10 0.4153622
2: B11 0.1567381
3: C12 0.5361883
4: D13 0.5920144
5: E14 0.3376648
6: A15 0.5503773

I tried the following which did not work:

DT2[, c("L", "D") := tstrsplit(a, "")][]
DT2[, c("L", "D") := tstrsplit(a, "[A-Z]")][]
DT2[, c("L", "D") := tstrsplit(a, "[0-9]{1}")][]

期望:

     a         b    L   D
1: A10 0.4153622    A   10
2: B11 0.1567381    B   11
3: C12 0.5361883    C   12
4: D13 0.5920144    D   13
5: E14 0.3376648    E   14
6: A15 0.5503773    A   15

非常感谢任何有关解释的帮助。

【问题讨论】:

  • 你不能用tstrsplit代替c(substr(a, 1, 1), substr(a, 2, 3))吗?

标签: r split data.table strsplit


【解决方案1】:

如果要在字母和数字之间拆分,可以在正则表达式 "(?&lt;=[A-Za-z])(?=[0-9])" 上拆分,(? 限制拆分到前面有一个字母,后面有一个数字的位置:

正则表达式包含两部分,看在(?&lt;=[A-Za-z])后面,意思是在一个字母之后向前看(?=[0-9]),即在一个数字之前,查看更多关于regexlook around,在r中,你需要指定 perl=TRUE 以使用 Perl 兼容的正则表达式来使这些工作:

DT2[, c("L", "D") := tstrsplit(a, "(?<=[A-Za-z])(?=[0-9])", perl=TRUE)][]

#     a          b L  D
#1: A10 0.01487372 A 10
#2: B11 0.95035709 B 11
#3: C12 0.49230300 C 12
#4: D13 0.67183871 D 13
#5: E14 0.40076579 E 14
#6: A15 0.27871477 A 15

【讨论】:

  • 感谢您的回答,请告诉我您为什么分配给? 或者换句话说(?&lt;=[A-Za-z]) 的剂量是什么意思?我知道正则表达式,但我不知道你为什么分配给?。此外,perl = TRUE 在这里意味着什么剂量,因为它没有在包装中解释/定义?
  • ? 是正则表达式组中的第一个字符时,它表示该组将有额外的选项。在这种情况下,"(?[A-Za-z],但不包括该组在匹配中。”类似地,(?=[0-9]) 表示“后面跟着一个数字,但不要将此组包含在匹配中。”
最近更新 更多