Wiem, że moje pytanie może wyglądać mgliście, ale mogęnie znaleźć lepszego wyjaśnienia tego. Miałem do czynienia z tym problemem od jakiegoś czasu i skończyło się na używaniu pętli we wszystkich wierszach, aby uniknąć tego problemu, ale jestem pewien, że istnieje rozwiązanie dla mojego zainteresowania. Mam ramkę danych A zawierającą trzy kolumny. Muszę sprawdzić dane w jednej z kolumn dla wszystkich wierszy i zastąpić je innymi wartościami, jeśli spełniają warunek (na przykład jeśli są NA, chcę zastąpić je wartością z ramki danych B, która jest zgodna z tym rząd w jednej funkcji). Załóżmy, że ramka danych A zawiera kod pocztowy, długość i długość w następujący sposób:
zip lat long
44121 41.5 -81.6
60618 NA NA
...
ramka danych B to baza danych wszystkich kodów pocztowych iodpowiadający im lat i długo. Chcę sprawdzić wszystkie wiersze ramek danych A i czy w kolumnie "Ł" znajduje się NA, Znajduje odpowiadające łodygi z ramki danych B na podstawie zipa kolumny, która jest wzajemna między dwiema ramkami danych. Napisałem ten kod, ale ciągle dostaję błąd:
A$lat <- ifelse(is.na(A$lat),B[B$zip==A$zip,"lat"],A$lat)
błąd to:
longer object length is not a multiple of shorter object length
Doceniam każdą pomoc. Wiem, że może to być łatwe pytanie, ale nie mogłem go naprawić przez jakiś czas.
Odpowiedzi:
0 dla odpowiedzi № 1Myślę, że problem z twoim kodem jest taki B$zip==A$zip
może zwrócić wiele wartości true. w oświadczeniu nie ma niczego, co wskazywałoby, że się tylko porównujesz A$zip
w rzędzie gdzie is.na(A$lat)
.
Tutaj, myślę, że zrobiłem to, czego chcesz, używając dplyr
pakiet. Jeśli tabela B zawiera wszystkie wymagane kody pocztowe, nie jestem pewien, dlaczego chcesz kod pocztowy z tabeli A. Być może tabela A ma większą dokładność niż w tabeli B. W każdym razie wydaje się to działać:
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)