以下是我想要分离的值:
f <- data.frame(x = c("c(58663.809, 232648.355, 0)", "c(5902.873, 232674.248, 0)"))
我想删除“c(”,用逗号分隔两个值,并删除最后两个字符“0)”。
生成的两列应如下所示: x = c(58663.809, 5902.873), y = c(232648.355, 232674.248
我是正则表达式新手。
非常感谢您的帮助。
这是使用
dplyr
和 tidyr
库的一种选择。
从字符串
x
中,我们删除 "c("
和 ")"
字符,使用 separate_wider_delim
将数据划分到不同的列中,同时删除最后一个值。最后,使用 type.convert
将列值更改为其各自的类型。
library(dplyr)
library(tidyr)
f %>%
mutate(x = gsub("c\\(|\\)", "", x)) %>%
separate_wider_delim(x, names = c("x", "y", NA), delim = ", ") %>%
type.convert(as.is = TRUE) %>%
data.frame()
# x y
#1 58663.809 232648.4
#2 5902.873 232674.2
首先,使用
regexpr
中的环视查找“c(”和“, 0)”之间的字符并提取 regmatches
。接下来 strsplit
、rbind
和 type.convert
到数字。最后转换 as.data.frame
和 setNames
。
> f$x |> regexpr(r'{(?<=c\()(.*)(?=,\s0\))}', text=_, perl=TRUE) |>
+ regmatches(x=f$x) |> strsplit(', ') |> do.call(what='rbind') |>
+ type.convert(as.is=TRUE) |> as.data.frame() |> setNames(c('x', 'y'))
x y
1 58663.809 232648.355
2 5902.873 232674.248
数据:
> dput(f)
structure(list(x = c("c(58663.809, 232648.355, 0)", "c(5902.873, 232674.248, 0)"
)), class = "data.frame", row.names = c(NA, -2L))