我知道我的问题可能看起来很模糊,但我无法找到更好的解释。我已经处理了这个问题一段时间了,我最终在所有行上使用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
我感谢任何帮助。我知道这可能是一个简单的问题,但我暂时无法修复它。
答案 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)