我有一个数据框,如下所示:
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“ function”:
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
我也不知道为什么 有人可以帮我解决这个问题吗?
谢谢
根据显示的模式,您可以尝试:(不使用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)]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句