/ / Jak zastosować funkcję do wszystkich wierszy w ramce danych używając innej ramki danych jako wejścia tej funkcji w r - r, zastosować

Jak stosować funkcję do wszystkich wierszy z dataframe przy użyciu innego dataframe jako dane wejściowe funkcji w r - r, stosuje się

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 № 1

Myś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)