2016-12-15 10 views

Odpowiedz

19

można zrobić:

dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA)) 
dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3)) 
dfa[is.na(dfa)] <- dfrepair[is.na(dfa)] 
dfa 

    a b c 
1 1 1 7 
2 3 5 7 
3 3 4 6 
4 4 3 5 
5 5 8 2 
6 7 9 3 
+7

Tworzenie nowej tabeli zamiast modyfikowania dfa: 'replace (dfa, is.na (dfa), dfrepair [is.na (dfa)])' – Frank

+0

To świetnie. Dzięki za pomoc. –

8

W tidyverse, można użyć purrr::map2_df, która jest ściśle dwuwymiarowym wersja mapply który upraszcza do data.frame i dplyr::coalesce, który zastępuje NA wartości w jego pierwszym argument z odpowiednimi w drugim.

library(tidyverse) 

dfrepair %>% 
    mutate_all(as.numeric) %>% # coalesce is strict about types 
    map2_df(dfa, ., coalesce) 

## # A tibble: 6 × 3 
##  a  b  c 
## <dbl> <dbl> <dbl> 
## 1  1  1  7 
## 2  3  5  7 
## 3  3  4  6 
## 4  4  3  5 
## 5  5  8  2 
## 6  7  9  3 
7

Możemy użyć Map z base R zrobić porównanie columnwise pomiędzy dwoma zestawami danych

dfa[] <- Map(function(x,y) {x[is.na(x)] <- y[is.na(x)]; x}, dfa, dfrepair) 
dfa 
# a b c 
#1 1 1 7 
#2 3 5 7 
#3 3 4 6 
#4 4 3 5 
#5 5 8 2 
#6 7 9 3 
2
dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA)) 
dfa 
dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3)) 
dfrepair 
library(dplyr) 
coalesce(as.numeric(dfa), as.numeric(dfrepair)) 

    a b c 
1 1 1 7 
2 3 5 7 
3 3 4 6 
4 4 3 5 
5 5 8 2 
6 7 9 3 

Jako kod w dplyr jest napisany w C++ jest szybszy w większości przypadków. Inną ważną zaletą jest to, że coalesce, a także wiele innych funkcji dplyr są takie same w SQL. Korzystając z dplyr nauczysz się języka SQL, kodując w R. ;-)

+1

Błąd "as.numeric" dla mnie, chociaż 'koalesce (dfa, dfrepair)' zaskakująco _ robi_ prace (doktorzy mówią tylko o wektorach, a nie całych data.frames) i nie narzeka na różne typy. – alistaire

+0

Dziękuję za as.numeric. ;-) Data.frame to lista listy i wektorów. W powyższym przypadku, jak również w wielu innych przypadkach jest to tylko lista wektorów zawierających liczby. Dlatego w naszym przypadku jest bardzo podobny do matrycy. Jeśli plik data.frame zawiera listy rekurencyjne, mój kod nie zostanie uruchomiony. – Ferdi

+0

Dane.frame może wyglądać jak macierz, ale podstawowa struktura jest bardzo różna. Data.frame jest listą jednowymiarowych wektorów, podczas gdy matryca jest pojedynczym wektorem z dwoma wymiarami. Większość funkcji przeznaczonych dla wektorów nie działa na data.frames; podsekcja w "koalescencji" musi być przypadkowa. – alistaire

Powiązane problemy