从 R 中的字符串正则表达式中删除句点和数字以外的所有内容
Remove everything except period and numbers from string regex in R
我知道有很多关于正则表达式堆栈溢出的问题,但我无法通过我所看到的可用帮助完成这项简单的任务。这是我的数据:
a<-c("Los Angeles, CA","New York, NY", "San Jose, CA")
b<-c("c(34.0522, 118.2437)","c(40.7128, 74.0059)","c(37.3382, 121.8863)")
df<-data.frame(a,b)
df
a b
1 Los Angeles, CA c(34.0522, 118.2437)
2 New York, NY c(40.7128, 74.0059)
3 San Jose, CA c(37.3382, 121.8863)
我想删除除数字和句点以外的所有内容(即删除 "c"、“)”和“(”。这是我迄今为止尝试过的方法:
str_replace(df$b,"[^0-9.]","" )
[1] "(34.0522, 118.2437)" "(40.7128, 74.0059)" "(37.3382, 121.8863)"
str_replace(df$b,"[^\d\)]+","" )
[1] "34.0522, 118.2437)" "40.7128, 74.0059)" "37.3382, 121.8863)"
不确定还可以尝试什么。我想以以下结尾:
[1] "34.0522, 118.2437" "40.7128, 74.0059" "37.3382, 121.8863"
谢谢。
试试这个
gsub("[\c|\(|\)]", "",df$b)
#[1] "34.0522, 118.2437" "40.7128, 74.0059" "37.3382, 121.8863"
不是正则表达式解决方案,而是一个简单的解决方案。
b
的元素是 R 表达式,所以遍历每个元素,解析它,然后创建你想要的字符串。
vapply(
b,
function(bi)
{
toString(eval(parse(text = bi)))
},
character(1)
)
如果我没理解错的话,这就是你想要的:
df$b <- gsub("[^[:digit:]., ]", "", df$b)
或:
df$b <- strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")
> df
a b
1 Los Angeles, CA 34.0522, 118.2437
2 New York, NY 40.7128, 74.0059
3 San Jose, CA 37.3382, 121.8863
或者如果您希望所有 "numbers" 作为数字向量:
as.numeric(unlist(strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")))
[1] 34.0522 118.2437 40.7128 74.0059 37.3382 121.8863
这是 stringr
中 str_extract_all
的另一个选项。使用 str_extract_all
将数字部分提取到 list
,转换为 numeric
,rbind
list
元素和 cbind
它的第一列'df'
library(stringr)
cbind(df[1], do.call(rbind,
lapply(str_extract_all(df$b, "[0-9.]+"), as.numeric)))
我知道有很多关于正则表达式堆栈溢出的问题,但我无法通过我所看到的可用帮助完成这项简单的任务。这是我的数据:
a<-c("Los Angeles, CA","New York, NY", "San Jose, CA")
b<-c("c(34.0522, 118.2437)","c(40.7128, 74.0059)","c(37.3382, 121.8863)")
df<-data.frame(a,b)
df
a b
1 Los Angeles, CA c(34.0522, 118.2437)
2 New York, NY c(40.7128, 74.0059)
3 San Jose, CA c(37.3382, 121.8863)
我想删除除数字和句点以外的所有内容(即删除 "c"、“)”和“(”。这是我迄今为止尝试过的方法:
str_replace(df$b,"[^0-9.]","" )
[1] "(34.0522, 118.2437)" "(40.7128, 74.0059)" "(37.3382, 121.8863)"
str_replace(df$b,"[^\d\)]+","" )
[1] "34.0522, 118.2437)" "40.7128, 74.0059)" "37.3382, 121.8863)"
不确定还可以尝试什么。我想以以下结尾:
[1] "34.0522, 118.2437" "40.7128, 74.0059" "37.3382, 121.8863"
谢谢。
试试这个
gsub("[\c|\(|\)]", "",df$b)
#[1] "34.0522, 118.2437" "40.7128, 74.0059" "37.3382, 121.8863"
不是正则表达式解决方案,而是一个简单的解决方案。
b
的元素是 R 表达式,所以遍历每个元素,解析它,然后创建你想要的字符串。
vapply(
b,
function(bi)
{
toString(eval(parse(text = bi)))
},
character(1)
)
如果我没理解错的话,这就是你想要的:
df$b <- gsub("[^[:digit:]., ]", "", df$b)
或:
df$b <- strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")
> df
a b
1 Los Angeles, CA 34.0522, 118.2437
2 New York, NY 40.7128, 74.0059
3 San Jose, CA 37.3382, 121.8863
或者如果您希望所有 "numbers" 作为数字向量:
as.numeric(unlist(strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")))
[1] 34.0522 118.2437 40.7128 74.0059 37.3382 121.8863
这是 stringr
中 str_extract_all
的另一个选项。使用 str_extract_all
将数字部分提取到 list
,转换为 numeric
,rbind
list
元素和 cbind
它的第一列'df'
library(stringr)
cbind(df[1], do.call(rbind,
lapply(str_extract_all(df$b, "[0-9.]+"), as.numeric)))