我的数据框如下:
plan address preferred
S3440 5301 E Huron River Dr Rm 1538 Ann Arbor, MI 48106 1-734-712-2492, xxx Not applicable
S3440 2140 E Ellsworth Rd Ann Arbor, MI 48108 1-734-477-9006, xxx Not applicable
S3440 2215 Fuller Road Ann Arbor, MI 48105 1-734-761-7933, xxx Not applicable
等。约27000s行值。地址选项卡后面的电话号码后面有更多,为了简洁我省略了它。
我想拆分地址,基本上删除电话号码及其后的所有内容。我通过正则表达式能够做到这一点:
str_split(x,'( [0-9]-[0-9]{3}-[0-9]{3}-[0-9]{4})')
我想在每一行都应用这个功能,所以我写了一个ddply"功能:"
ddply(final_data2, .(address), function(x){str_split(x,'( [0-9]-[0-9]{3}-[0-9]{3}-[0-9]{4})')})
然而,这会吐出错误:
Error: String must be an atomic vector
我不知道为什么。有人可以帮我解决这个问题吗?
谢谢
答案 0 :(得分:1)
根据显示的模式,您可以尝试:(不使用ddply
)
library(stringr)
str_extract(final_data2$address, perl('.*(?= .-.*)'))
#[1] "5301 E Huron River Dr Rm 1538 Ann Arbor, MI 48106"
#[2] "2140 E Ellsworth Rd Ann Arbor, MI 48108"
#[3] "2215 Fuller Road Ann Arbor, MI 48105"
('.*(?= .-.*) # extract everything before a `space`, followed by one character, followed by `-`.
使用您的代码:
simplify2array(str_split(final_data2$address, '( [0-9]-[0-9]{3}-[0-9]{3}-[0-9]{4})'))[c(T,F)]
#[1] "5301 E Huron River Dr Rm 1538 Ann Arbor, MI 48106"
#[2] "2140 E Ellsworth Rd Ann Arbor, MI 48108"
#[3] "2215 Fuller Road Ann Arbor, MI 48105"
我不明白为什么要使用ddply
并使用address
作为分组变量。这似乎有效,但不需要。
unlist(daply(final_data2, .(address), function(x){str_split(x$address,'( [0-9]-[0-9]{3}-[0-9]{3}-[0-9]{4})')}),use.names=F)[c(T,F)]
答案 1 :(得分:0)
申请工作
apply(final_data2[,2],1,function(x) str_split(x,'[0-9]-[0-9]{3}-[0-9]{3}-[0-9]{4}')[[1]][1])
但是gsub更快
gsub("[0-9]-[0-9]{3}-[0-9]{3}-[0-9]{4}.*","",final_data2$address)