【问题标题】:Why is ddply not working on this data frame?为什么 ddply 不能处理这个数据框?
【发布时间】:2014-07-18 00:18:11
【问题描述】:

我有一个数据框如下:

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

等等。价值约 27000 行。地址标签后面的电话号码后面还有很多,为了简洁我省略了。

我想拆分地址,基本上删除电话号码及其后面的所有内容。我已经能够通过正则表达式做到这一点:

 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

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

谢谢

【问题讨论】:

  • 什么是class(final_data2$address)?我猜这是一个“因素”而不是“角色”。尝试使用as.character转换为字符
  • 有趣,我可以轻松步行到至少其中一个地址。
  • 在您的ddply 调用中,函数将(仍然)获得一个数据框,因此您的str_split() 应该使用x$address。因此,从另一个角度,您也可以这样做(未测试):str_split(final_data2$address, ...)

标签: r plyr


【解决方案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)]

【讨论】:

    【解决方案2】:

    申请作品

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 2017-04-04
      • 2020-05-06
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多