R中合并的后缀

时间:2015-09-08 08:25:56

标签: r function merge

我有两个需要合并的数据框,它们有共同的列名。 在合并之后,我想总结具有相同名称的列名并仅保留一列。合并添加后缀(.x和.y),我需要事先摆脱它。我使用下面的代码执行此操作并且它可以工作(为简洁起见,省略了求和部分)。这有效:

> x=data.frame(c("2015-05-31","2015-06-30","2015-07-31"),c(100,200,150))
> colnames(x)=c("Date","AAPL")
> x[,1]=as.Date(x[,1],origin="1970-01-01")
> 
> x
        Date AAPL
1 2015-05-31  100
2 2015-06-30  200
3 2015-07-31  150
> 
> y=data.frame(c("2015-05-31","2015-06-30","2015-07-31"),c(3000,8000,2000))
> colnames(y)=c("Date","AAPL")
> y[,1]=as.Date(y[,1],origin="1970-01-01")
> 
> 
> 
> 
> 
> tt=merge(x,y,by='Date',all=TRUE)
> 
> rename=colnames(tt)
> rename=gsub(".x","",rename,fixed=TRUE)
> rename=gsub(".y","",rename,fixed=TRUE)
> colnames(tt)= c(rename)
> 
> tt
        Date AAPL AAPL
1 2015-05-31  100 3000
2 2015-06-30  200 8000
3 2015-07-31  150 2000

但是,我想省略重命名部分,我尝试了空后缀:

> tt=merge(x,y,by='Date',all=TRUE)
> tt=merge(x,y,by='Date',all=TRUE,suffixes = c("",""))
Warning message:
In merge.data.frame(x, y, by = "Date", all = TRUE, suffixes = c("",  :
  column name ‘AAPL’ is duplicated in the result
> tt
        Date AAPL AAPL
1 2015-05-31  100 3000
2 2015-06-30  200 8000
3 2015-07-31  150 2000

我收到上面显示的错误消息,但这也有效。问题是,如果我把函数中带有后缀= c("","")的代码,那么我得到错误消息并且没有生成数据帧tt 。不知道怎么解决这个问题?

这是功能:

out=function(){
tt=merge(shares,spin,by='Date',all=TRUE,suffixes = c("",""))
tt=merge(tt,ma5,by='Date',all=TRUE,suffixes = c("",""))
return(tt)
}

out()

2 个答案:

答案 0 :(得分:0)

编辑数据,再添加一个双列和一个。

x=data.frame(Date= as.Date(c("2015-05-31","2015-06-30","2015-07-31")),
             AAPL=c(100,200,150),
             v2=1:3,
             v3=1:3)

y=data.frame(Date=as.Date(c("2015-05-31","2015-06-30","2015-07-31")),
             AAPL=c(3000,8000,2000),
             v2=1:3)

方法1:使用来自plyr的rbind.fill,然后使用sum作为聚合函数dcast(错误随着融合被删除,你想用它做什么取决于数据)

library(reshape2)
library(plyr)
tt1 <- melt(rbind.fill(x,y),id.var="Date",na.rm=T)
res <- dcast(data=tt1, Date~variable,fun.aggregate = sum)
> res
        Date AAPL v2 v3
1 2015-05-31 3100  2  1
2 2015-06-30 8200  4  2
3 2015-07-31 2150  6  3

方法2,如果你真的想使用合并(这可能会更短,但我不能直接看到如何)

tt=merge(x,y,by='Date',all=TRUE)
merged_pattern <- "\\.[x|y]"
#vector of columns you need to sum because they are double
cols_to_sum <- unique(gsub(merged_pattern,"",
                    grep(merged_pattern,colnames(tt),value=T)))

res <- do.call("cbind", list(tt[,!grepl(merged_pattern,colnames(tt))]
                             ,sapply(cols_to_sum, function(x){
  rowSums(tt[,grepl(x,colnames(tt))])
}))
)
res

> res
        Date v3 AAPL v2
1 2015-05-31  1 3100  2
2 2015-06-30  2 8200  4
3 2015-07-31  3 2150  6

答案 1 :(得分:0)

我编写了safejoin软件包,它非常简洁地解决了这个问题

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
safe_left_join(x, y, by = "Date", conflict = `+`)
#         Date AAPL
# 1 2015-05-31 3100
# 2 2015-06-30 8200
# 3 2015-07-31 2150