2016-12-15 12 views

cevap

19

Sen yapabilirsiniz:

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

Yeni bir tablo oluşturmak yerine dfa değiştiriliyorsa: 'replace (dfa, is.na (dfa), dfrepair [is.na (dfa)])' – Frank

+0

Bu harika. Yardım ettiğin için teşekkür ederim. –

8

tidyverse, bir data.frame için basitleştiren mapply bir kesinlikle değişkenli versiyonudur purrr::map2_df, ve ilk yılında NA değerlerini değiştirir dplyr::coalesce kullanabilirsiniz ikincide karşılık gelen olanlar ile argüman.

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

Biz iki veri setleri dplyr kod C yazıldığı gibi

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 

arasında bir columnwise karşılaştırma yapmak base R den Map kullanabilirsiniz ++ daha hızlı çoğu durumda olduğunu. Diğer bir önemli avantajı, coalesce'un yanı sıra diğer birçok dplyr işlevinin SQL'de aynı olmasıdır. dplyr'u kullanarak SQL'i R kodlayarak öğrenirsiniz. ;-)

+1

'as.numeric's' şaşırtıcı _does_ işi (dokümanlar yalnızca vektörler, bütün değil data.frames hakkında konuşmak) COALESCE (DFA, dfrepair) 'da, benim için hata ve farklı türleri hakkında şikayet etmez. – alistaire

+0

As.numeric için teşekkürler. ;-) Bir data.frame, liste ve vektörlerin bir listesidir. Yukarıdaki örnekte olduğu gibi, birçok durumda, sayıları içeren vektörlerin sadece bir listesidir. Dolayısıyla bizim durumumuzda bir matrise çok benzer. Data.frame özyinelemeli listeler içeriyorsa kodum çalışmaz. – Ferdi

+0

Bir data.frame bir matris gibi görünebilir, ancak alttaki yapı çok farklıdır. Bir data.frame tek boyutlu vektörlerin bir listesidir, matris ise iki boyutlu tek bir vektördür. Vektörler için tasarlanan çoğu fonksiyon data.frames üzerinde çalışmıyor; 'coalesce' alt kümesinin tesadüfi olması gerekir. – alistaire

İlgili konular