我正在尝试使用 apply() 填充数据框中的附加列,并调用我为数据框的每一行创建的函数。
数据框称为 Hit.Data
,有 2 列 Zip.Code
和 Hits
。这里有几行
Zip.Code , Hits
97222 , 20
10100 , 35
87700 , 23
应用代码如下:
Hit.Data$Zone = apply(Hit.Data, 1, function(x) lookupZone("89000", x["Zip.Code"]))
lookupZone()
函数如下:
lookupZone <- function(sourceZip, destZip){
sourceKey = substr(sourceZip, 1, 3)
destKey = substr(destZips, 1, 3)
return(zipToZipZoneMap[[sourceKey]][[destKey]])
}
lookupZone()
函数所做的就是获取 2 个字符串,截断为所需的字符并查找值。当我运行此代码时,会发生什么情况:R 向 Hit.Data$Zone
分配一个列表,而不是逐行填充数据。
> typeof(Hit.Data$Zone)
[1] "list
令我困惑的是,当我使用 apply 并告诉它在其中输入一个数字时,它就能正常工作:
> Hit.Data$Zone = apply(Hit.Data, 1, function(x) 2)
> typeof(Hit.Data$Zone)
[1] "double"
我知道 R 在降低矩阵维数和用列表做奇怪的事情方面有很多奇怪的行为,但这看起来应该非常简单。我缺少什么?我觉得 R 有一些基本的东西是我正在奋斗的,而且到目前为止它正在获胜。
最佳答案
您的问题是您偶尔会在 HashMap 中查找不存在的条目,这会导致哈希默默返回 NULL。考虑:
> hash("890", hash("972"=3, "101"=3, "877"=3))[["890"]][["101"]]
[1] 3
> hash("890", hash("972"=3, "101"=3, "877"=3))[["890"]][["100"]]
NULL
如果apply
遇到任何NULL值,那么它不能将结果强制转换为向量,因此它将返回一个列表。 sapply
也会发生同样的情况。
您必须确保数据中前三个邮政编码数字的所有可能组合都存在于哈希中,或者您需要代码中的逻辑来返回 NA
而不是 NULL
查找缺失的条目。
关于R 返回列表而不是填充数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685741/