我有两个需要合并的数据框,它们有共同的列名。 在合并之后,我想总结具有相同名称的列名并仅保留一列。合并添加后缀(.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()
答案 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