从多列文本中提取 ID
Extract IDs from Text in many columns
我有一个巨大的df,由不同的符号(#,space,)隔开。
读取数据后,我有尚未分离的列。
我尝试使用 tidyr::separate
来分隔列。
但是因为我有很多列,所以分离的结果会覆盖下一列。
我尝试使用“'tidyr::separate'”来分隔列。
但是因为我有很多列,所以分离的结果会覆盖下一列。
一栏的内容如下所示:
Markt#ID=3002349#X=8612088#Y=50228881#RI=1|&RD=10062019&RT=6:46&L=1543&SM=0#1#2&CT=-1#-1#-1#-1#-1&P1=1111111111111111&O1=99999999&T1=99999999&F=-1&RF=1999991999999999111090999999&GP=FF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#BF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#&
总而言之,我有 12 列要从中提取 IDs
和 coordinates
。
预期结果:
ID X Y
3002349 8612088 50228881
如果所有行的格式都相同,您可以使用 tidyr::extract
tidyr::extract(df, v1, c("ID", "X", "Y"), regex = ".*ID=(\d+)#X=(\d+)#Y=(\d+)")
# ID X Y
#1 3002349 8612088 50228881
这会从文本中提取数字,后跟 ID
、X
和 Y
标签。
数据
x <- "Markt#ID=3002349#X=8612088#Y=50228881#RI=1|&RD=10062019&RT=6:46&L=1543&SM=0#1#2&CT=-1#-1#-1#-1#-1&P1=1111111111111111&O1=99999999&T1=99999999&F=-1&RF=1999991999999999111090999999&GP=FF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#BF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#&"
df <- data.frame(v1 = x)
我们可以在 base R
中使用 read.csv
和 sub
来做到这一点
read.csv(text= sub(".*ID=(\d+)#X=(\d+)#Y=(\d+).*", "\1,\2,\3",
df$v1), header = FALSE, col.names = c("ID", "X", "Y"))
# ID X Y
#1 3002349 8612088 50228881
数据
df <- structure(list(v1 = structure(1L, .Label = "Markt#ID=3002349#X=8612088#Y=50228881#RI=1|&RD=10062019&RT=6:46&L=1543&SM=0#1#2&CT=-1#-1#-1#-1#-1&P1=1111111111111111&O1=99999999&T1=99999999&F=-1&RF=1999991999999999111090999999&GP=FF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#BF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#&", class = "factor")), class = "data.frame", row.names = c(NA,
-1L))
我有一个巨大的df,由不同的符号(#,space,)隔开。
读取数据后,我有尚未分离的列。
我尝试使用 tidyr::separate
来分隔列。
但是因为我有很多列,所以分离的结果会覆盖下一列。
我尝试使用“'tidyr::separate'”来分隔列。 但是因为我有很多列,所以分离的结果会覆盖下一列。
一栏的内容如下所示:
Markt#ID=3002349#X=8612088#Y=50228881#RI=1|&RD=10062019&RT=6:46&L=1543&SM=0#1#2&CT=-1#-1#-1#-1#-1&P1=1111111111111111&O1=99999999&T1=99999999&F=-1&RF=1999991999999999111090999999&GP=FF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#BF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#&
总而言之,我有 12 列要从中提取 IDs
和 coordinates
。
预期结果:
ID X Y
3002349 8612088 50228881
如果所有行的格式都相同,您可以使用 tidyr::extract
tidyr::extract(df, v1, c("ID", "X", "Y"), regex = ".*ID=(\d+)#X=(\d+)#Y=(\d+)")
# ID X Y
#1 3002349 8612088 50228881
这会从文本中提取数字,后跟 ID
、X
和 Y
标签。
数据
x <- "Markt#ID=3002349#X=8612088#Y=50228881#RI=1|&RD=10062019&RT=6:46&L=1543&SM=0#1#2&CT=-1#-1#-1#-1#-1&P1=1111111111111111&O1=99999999&T1=99999999&F=-1&RF=1999991999999999111090999999&GP=FF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#BF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#&"
df <- data.frame(v1 = x)
我们可以在 base R
中使用 read.csv
和 sub
read.csv(text= sub(".*ID=(\d+)#X=(\d+)#Y=(\d+).*", "\1,\2,\3",
df$v1), header = FALSE, col.names = c("ID", "X", "Y"))
# ID X Y
#1 3002349 8612088 50228881
数据
df <- structure(list(v1 = structure(1L, .Label = "Markt#ID=3002349#X=8612088#Y=50228881#RI=1|&RD=10062019&RT=6:46&L=1543&SM=0#1#2&CT=-1#-1#-1#-1#-1&P1=1111111111111111&O1=99999999&T1=99999999&F=-1&RF=1999991999999999111090999999&GP=FF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#BF=cost=-1|minDist=0|maxDist=2000|speed=100|routingType=1|ellipseRadius=1000|maxDur=120|waitTime=-1|linDistRouting=0|#&", class = "factor")), class = "data.frame", row.names = c(NA,
-1L))