2016-12-15 12 views
18

で同じ位置に値をdata.frameでNASに置き換える:R:私はいくつかのNA値を持つデータフレームを持っている別のデータフレーム

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 

私は同じ位置にある値を使用してNASに交換したいと思います別のデータフレームに:

dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3)) 
dfrepair 

私が試した:

dfa1 <- dfa 

dfa1 <- ifelse(dfa == NA, dfrepair, dfa) 
dfa1 

が、これは動作しませんでした。あなたが行うことができます

答えて

19

:tidyverseで

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

dfaを変更する代わりに新しいテーブルを作成する場合: 'replace(dfa、is.na(dfa)、dfrepair [is.na(dfa)]) ' – Frank

+0

これは素晴らしいことです。ご協力いただきありがとうございます。 –

8

を、あなたは、その最初にNA値を置き換えるdata.frameのように簡単にmapplyの厳密二変数バージョンですpurrr::map2_df、およびdplyr::coalesceを、使用することができます引き数を2番目の引数に対応させます。

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

我々は2つのデータセットdplyrのコードはCで書かれているとおり

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 

間の列方向の比較を行うためにbase RからMapを使用することができ++、それはより速く、ほとんどの場合です。他の重要な利点は、​​3210と多くの他のdplyr関数がSQLで同じであることです。 dplyrを使用すると、RでコーディングしてSQLを学習できます。 ;-)

+1

'coalesce(dfa、dfrepair)'は驚くほどうまくいきません(ドキュメントはベクトルだけで、data.frames全体ではありません)、さまざまなタイプについて文句を言うことはありません。 – alistaire

+0

ありがとうございますas.numeric。 ;-) data.frameは、リストとベクトルのリストです。上記の場合と同様に、多くの場合、数値を含むベクトルのリストにすぎません。したがって、私たちの場合、それは行列と非常に似ています。 data.frameに再帰的なリストが含まれていると、コードが実行されません。 – Ferdi

+0

data.frameは行列のように見えるかもしれませんが、基になる構造は非常に異なります。 data.frameは1次元ベクトルのリストですが、行列は2次元の単一ベクトルです。ベクトル用に設計されたほとんどの関数はdata.framesでは機能しません。 「合体」の部分集合は偶然でなければならない。 – alistaire

関連する問題