R中的插值/查找

R中的插值/查找,r,gps,interpolation,lookup,R,Gps,Interpolation,Lookup,我正在从excel切换到R,我想知道如何在R中执行此操作。 我有一个类似以下内容的数据集: df1<-data.frame(Zipcode=c("7941AH","7941AG","7941AH","7941AZ"), From=c(2,30,45,1), To=c(20,38,57,8), Type=c("even","mixed","odd","mixed"),

我正在从excel切换到R,我想知道如何在R中执行此操作。
我有一个类似以下内容的数据集:

df1<-data.frame(Zipcode=c("7941AH","7941AG","7941AH","7941AZ"),
                From=c(2,30,45,1),
                To=c(20,38,57,8),
                Type=c("even","mixed","odd","mixed"),
                GPS=c(12345,54321,11221,22331)) 

df2<-data.frame(zipcode=c("7914AH", "7914AH", "7914AH", "7914AG","7914AG","7914AZ"), 
                housenum=c(18, 19, 50, 32, 104,11))

df1我只需遍历
df2
中的每个元素,实现检查邮政编码是否匹配、元素范围是否正确以及偶数/奇数是否正确所需的逻辑:

# Clean up data (character zip codes and fix the 7914 vs. 7941 issue in zip codes)
df2<-data.frame(zipcode=c("7941AH", "7941AH", "7941AH", "7941AG","7941AG","7941AZ"), 
                housenum=c(18, 19, 50, 32, 104,11))
df1$Zipcode <- as.character(df1$Zipcode)
df2$zipcode <- as.character(df2$zipcode)

# Loop to compute the GPS values
sapply(seq(nrow(df2)), function(x) {
  m <- df2[x,]
  matched <- df1$Zipcode == m$zipcode &
    m$housenum >= df1$From &
    m$housenum <= df1$To &
    (df1$Type == "mixed" |
     (df1$Type == "odd" & m$housenum %% 2 == 1) |
     (df1$Type == "even" & m$housenum %% 2 == 0))
  if (sum(matched) != 1) {
    return(NA)  # No matches or multiple matches
  } else {
    return(df1$GPS[matched])
  }
})
# [1] 12345    NA    NA 54321    NA    NA
#清理数据(输入邮政编码并修复邮政编码中7914与7941的问题)

df2给定大数据帧,您的最佳选择可能是按其邮政编码合并
df1
df2
(即从具有相同邮政编码的数据帧中获取每对行),按门牌号标准过滤,删除重复项(如果
df1
中的多个规则匹配),然后存储所有匹配房屋的信息。让我们从您指定大小的示例数据集开始:

set.seed(144)
df1 <- data.frame(Zipcode=sample(1:280000, 472000, replace=TRUE),
                  From=sample(1:50, 472000, replace=TRUE),
                  To=sample(51:100, 472000, replace=TRUE),
                  Type=sample(c("even", "odd", "mixed"), 472000, replace=TRUE),
                  GPS=sample(1:100, 472000, replace=TRUE))
df2 <- data.frame(zipcode=sample(1:280000, 1.1e6, replace=TRUE),
                  housenum=sample(1:100, 1.1e6, replace=TRUE))
set.seed(144)

df1您的意思是在您的示例中使用
7941AH
?您的
df1
没有覆盖2到20之间的7941AG。这很好用!然而,我的实际数据集包含大约100万个观察值。我使用proc.time()为500、1000和1500个观察值的执行计时,如果我推断这一点,将需要大约90小时才能完成。你知道为什么R在循环方面有这么多麻烦吗?@nsnvc有趣的是——你的问题没有提到任何关于拥有一个效率成问题的大型数据集的问题。您能否用数据集的详细信息更新您的问题(邮政编码的数量,
df1
的大小,
df2
的大小)?我已经更新了原始问题。顺便说一句,我刚刚看到你是15.071x:分析边缘的开发者之一。多好的课程啊!!这就是我改用R的原因。
get.gps <- function(df1, df2) {
  # Add ID to df2
  df2$id <- 1:nrow(df2)
  m <- merge(df1, df2, by.x="Zipcode", by.y="zipcode")
  m <- m[m$housenum >= m$From &
         m$housenum <= m$To &
         (m$Type == "mixed" |
          (m$Type == "odd" & m$housenum %% 2 == 1) |
          (m$Type == "even" & m$housenum %% 2 == 0)),]
  m <- m[!duplicated(m$id) & !duplicated(m$id, fromLast=TRUE),]
  GPS <- rep(NA, nrow(df2))
  GPS[m$id] <- m$GPS
  return(GPS)
}
system.time(get.gps(df1, df2))
#    user  system elapsed 
#  16.197   0.561  17.583