2017-06-07 8 views
0
a<-data.frame(cbind("Sample"=c("100","101","102","103"),"Status"=c("Y","","","partial"))) 
b<-data.frame(cbind("Sample"=c("100","101","102","103","106"),"Status"=c("NA","Y","","","Y"))) 

desired<-data.frame(cbind("Sample"=c("100","101","102","103","106"),"Status"=c("Y","Y","","partial","Y"))) 

複数のソースにサンプル処理データがあり、それらを結合してマスターリストにしたいと思います。各サンプルに対して "Y"と "partial"を照合するために、2つのデータフレームの間で "ステータス"列を結合することができますか?前もって感謝します。Rデータフレームでデータが重複している列を結合する

+1

のとBの両方の変数が要因です。このような要因を扱うことは、首の痛みです。これらを文字と数値に変換することを検討してください。これは扱いやすいものです。 – lmo

+0

単に 'cbind'を使わずに' data.frame'を使うか、行列をdata.frameに変換する前に行列を作成しています。また、 '' ''の代わりに '' NA''を使うと、あなたの人生が楽になります。 – alistaire

+0

Alistaire、あなたは正しい、私の例はcbindとちょっとぞっとする。この例は、存在する可能性のある〜10個の ""/NAの文字列(部分的/ Yだけではない)が存在するため、単純すぎるものです。これにより、Mudskipperのソリューションは少し面倒になります。私はSimoneの ":="構文に精通しておらず、実行されていないようです。 – sm002

答えて

1
require(data.table)  

a<-data.table(cbind("Sample"=c("100","101","102","103"),"Status"=c("Y","","","partial"))) 
b<-data.table("Sample"=c("100","101","102","103","106"),"Status"=c("NA","Y","","","Y")) 

c <- merge(a, b, by = "Sample", all=TRUE) 
c[,Status := ifelse(!is.na(Status.x), Status.x, Status.y)] 
c[,`:=` (Status.x=NULL, Status.y = NULL)] 
+0

こんにちはSimone、私はこのアプローチがより一般化されているのが好きですが、=うまくいかないようです。構文エラーはどこですか? – sm002

+0

@ sm002私は答えを更新しました。あなたはdata.tableをロードする必要があります – simone

1

aとbの値を優先順位で維持したいとします.Yは何もカバーしていないNAを部分的にカバーします。

d <- merge(a,b,by="Sample",all=TRUE) 
d$Status <- "" 
d$Status[apply(c,1,function(x){any(is.na(x))})] <- "" # cleaning the NAs I introduced with the merge 
d$Status[apply(c,1,`%in%`, x = "NA")] <- NA # or "NA" if you want to keep it this way, or "" if you want to get rid of them 
d$Status[apply(c,1,`%in%`, x = "partial")] <- "partial" 
d$Status[apply(c,1,`%in%`, x = "Y")] <- "Y" 
d <- d[,c(1,4)] 

# Sample Status 
# 1 100  Y 
# 2 101  Y 
# 3 102   
# 4 103 partial 
# 5 106  Y 
+0

私のマージはいくつかのNAを追加していますが(実際のNA、「NA」ではなく)、実際のNAをデータセットに入れて何らかの理由でそれらを保持したい場合は、 b(「NA」、Infなど) –

関連する問題