2017-06-14 7 views
0
combine_cols<- function(primary,secondary,linker,column) { 
require(data.table) 
a<-data.table("Sample"=primary[,linker], primary[,column]) 
b<-data.table("Sample"=secondary[,linker], secondary[,column]) 

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

return(c) 
} 
mydata1<-data.frame("Sample"=c("100","101","102","103"),"Status"=c("Y","","","partial")) 
mydata2<-data.frame("Sample"=c("100","101","102","103","106"),"Status"=c("NA","Y","","","Y")) 
print((combine_cols(mydata1,mydata2,"Sample",c("Status")))) 

でペーストを使用しました。 paste0(column,".x")が文字として認識され、列名ではないため、ifelse行が機能しません。 c[,paste0(column,".x")]c$c[,paste0(column,".x")]が反映されるようにするにはどうすればよいですか?さらに、この行を変更して列名のリストを処理するにはどうすればよいですか?私は、分割データの列をマージする機能を作成しようとしているデータフレームの列コール

+1

オブジェクトに名前を付けるときは、コードで使用されるcなどのR関数は使用しないでください。 –

+0

可能なdupe:['data.table'で動的カラム名を使う](https://stackoverflow.com/q/14937165/903061) – Gregor

答えて

0

標準の名前で名前を変更して名前を変更するだけで、読みやすくなります。あなたの例で

a<-data.table("Sample"=primary[,linker], "tempname" =primary[,column])  # added tempname 
b<-data.table("Sample"=secondary[,linker], "tempname" =secondary[,column]) # added tempname 
c <- merge(a, b, by = "Sample", all=TRUE) 
c[,Status := ifelse(!is.na(tempname.x),tempname.x,tempname.y)] 
setnames(c,paste0("tempname",c(".x",".y")),paste0(column,c(".x",".y"))) 

Sample Status.x Status.y Status 
1: 100  Y  NA  3 
2: 101     Y  1 
3: 102      1 
4: 103 partial    2 
5: 106  NA  Y  3 

私は(return前)に次の行を行うことになっているもの見当がつかない、それは失敗しますが、それは問題の一部ではないとして(まだ)、ここに行く。

関連する問題