如何使用另一个数据框作为r

时间:2017-10-26 13:27:05

标签: r apply

我知道我的问题可能看起来很模糊,但我无法找到更好的解释。我已经处理了这个问题一段时间了,我最终在所有行上使用for循环来避免这个问题,但我确信有一个解决方案可以解决我的问题。我有数据框A包括三列。我需要检查所有行的其中一列中的数据,如果它们满足条件,则将其替换为其他值(例如,如果它们是NA,我想用数据帧B中的值替换它们,这是与此匹配的排在一个特征中)。假设数据帧A包括zipcode,lat和long,如下所示:

    zip     lat    long
    44121   41.5   -81.6
    60618   NA     NA
     ...

dataframe B是所有美国邮政编码及其对应的纬度和长度的数据库。我想检查数据帧A的所有行,如果lat列中有NA,它会根据两个数据帧之间相互的列zip找到数据帧B中的相应lat。我写了这段代码,但一直收到错误:

    A$lat <- ifelse(is.na(A$lat),B[B$zip==A$zip,"lat"],A$lat)

错误是:

    longer object length is not a multiple of shorter object length

我感谢任何帮助。我知道这可能是一个简单的问题,但我暂时无法修复它。

1 个答案:

答案 0 :(得分:0)

我认为您的代码存在的问题是B$zip==A$zip可能会返回多个真值。声明中没有任何内容可指明您只是在A$zip的行中比较is.na(A$lat)

在这里,我想我已经使用dplyr包做了你想做的事。如果表B包含您想要的所有邮政编码,那么我不确定您为什么需要表A中的邮政编码。也许表A比表B更精确。无论如何,这似乎有用:

library(dplyr)

dfA <- tribble(
~zip,     ~lat,    ~long,
44121 ,  41.5,   -81.6,
60618,   NA,     NA,
38112,  NA,      NA,
29656,  33,       -81)


dfB <- tribble(
  ~zip, ~lat, ~long,
  11111,40,   -80,
  22222, 50,  -70,
  60618, 32,   -78,
  38112, 32,   -83 )

## If you want to keep the lat-longs in dfA and only replace NAs
dfC <- left_join( dfA, dfB, by="zip") %>%
  mutate(lat=if_else(is.na(lat.x), lat.y, lat.x),
              long=if_else(is.na(lat.x), lat.y, lat.x)) %>%
  select(-lat.x, -lat.y, -long.x, -long.y)

## If dfB has all of the lat-longs you need:
dfD <- select(dfA, -lat, -long) %>%
         left_join(dfB)