为什么ddply没有在这个数据框架上工作?

时间:2014-07-18 00:18:12

标签: r plyr

我的数据框如下:

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

我不知道为什么。有人可以帮我解决这个问题吗?

谢谢

2 个答案:

答案 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)