2017-06-14 21 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")))) 

我试图创建一个函数来合并拆分数据的列。 ifelse行不起作用,因为paste0(column,".x")被识别为字符而不是列名。我如何确保c[,paste0(column,".x")]反映c$c[,paste0(column,".x")]?更好的是,我如何修改这一行来处理列名称列表?在数据框中使用粘贴列调用

+1

当命名一个对象时,请避免使用R函数,比如在你的代码中使用c。 –

+0

可能的重复:[在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之前)是应该做的,而且它会失败,但是这不是问题的一部分(但), 开始。