在R中对data.frame中的每一行应用一个函数,并将结果追加到data.frame中。

8

看起来我应该知道如何做到这一点,或者至少在这里或其他地方找到答案。不幸的是,两者都没用。

我有一个客户数据框,其中一列是他们的ID,另一列是他们的完整地址。我想为每行添加3列,这些列来自地理编码查找的纬度、经度和县代码。

该数据框如下:

customer_id       fulladdress
     1            123 Main St., Anywhere, FL
     2            321 Oak St., Thisplace, CA

我创建了一个地理编码函数,它接收完整地址并返回带有纬度、经度和县/区列的数据框。

如何将我的地理编码函数应用于数据框中的每一行,并将结果作为3列附加到现有数据框中,使其看起来像这样:

customer_id       fulladdress                      lat        long     county
     1            123 Main St., Anywhere, FL     33.2345    -92.3333   43754
     2            321 Oak St., Thisplace, CA     25.3333    -120.333   32960

我试过使用apply和ddply,但似乎无法理解它们的作用。我用ddply尝试过,但它只是给我原始数据框而已。

ddply(customers[1:3,], .(fulladdress), function(x) { geocode(x$fulladdress)})

感谢您的帮助。

3
cbind(customers, sapply(geocode(customers$fulladdress))) 的意思是将 customers 数据框与 geocode(customers$fulladdress) 的结果按列合并。其中,geocode() 是一个函数,可以根据输入的地址信息获取地理编码信息(例如经度和纬度)。sapply() 函数则可以对一个列表或向量中的每个元素应用指定的函数,并返回一个结果向量。 - James
1
使用以下代码将列命名为“geocode”:data.frame(customers, "geocode"=sapply(geocode(customers$fulladdress))) - Brandon Bertelsen
感谢您让我找到正确的方向。这是最终可行的代码:cbind(customers, t(sapply(customers$fulladdress,geocode, USE.NAMES=F))) - Dave Kincaid
你可以将其作为自己的答案添加并接受它,以此来结束这个问题。 - ROLO
你能发布一下地理编码函数吗?听起来非常有趣和有用。 - Tyler Rinker
1
我在https://gist.github.com/1365208上发布了这个函数。它之前是可以工作的,但现在运行时出现了“500内部服务器错误”。要么是Infochimps挂了,要么是我之前玩它时超过了我的配额。您需要将您的infochimps api密钥放入api.key变量中。然后只需传入一个地址,您就可以得到纬度、经度和县代码。 - Dave Kincaid
1个回答

4

感谢您帮我找到正确的方法。以下是最终可用的方式:

cbind(customers, t(sapply(customers$fulladdress,geocode, USE.NAMES=F))) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接