我知道关于正则表达式的堆栈溢出有很多问题,但我无法通过我见过的可用帮助完成这一个简单的任务。这是我的数据:
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"
感谢。
答案 0 :(得分:5)
如果我理解正确,这就是你想要的:
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
或者如果您想将所有“数字”作为数字向量:
as.numeric(unlist(strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")))
[1] 34.0522 118.2437 40.7128 74.0059 37.3382 121.8863
答案 1 :(得分:3)
试试这个
gsub("[\\c|\\(|\\)]", "",df$b)
#[1] "34.0522, 118.2437" "40.7128, 74.0059" "37.3382, 121.8863"
答案 2 :(得分:2)
不是正则表达式解决方案,而是一个简单的解决方案。
b
的元素是R表达式,因此遍历每个元素,解析它,然后创建所需的字符串。
vapply(
b,
function(bi)
{
toString(eval(parse(text = bi)))
},
character(1)
)
答案 3 :(得分:1)
以下是来自str_extract_all
的{{1}}的另一个选项。使用stringr
将数字部分提取到str_extract_all
,将list
,numeric
rbind
元素转换为list
,将cbind
元素提取到第一列&#39; DF&#39;
library(stringr)
cbind(df[1], do.call(rbind,
lapply(str_extract_all(df$b, "[0-9.]+"), as.numeric)))