合并多个表

时间:2013-06-04 21:17:07

标签: r for-loop merge

我有重塑数据的问题;以下是我的示例数据集。

x<-data.frame(SN=rep(1:4,c(3,3,4,4)),value=1:14,F=rep(c(LETTERS[1:4]), each = 1, len =  14))

我需要使用包含唯一SN数据的列重新创建数据,然后使用“value”中的SN分配列名以标识SN。最后,我需要将它们合并在一起。

我想要以下输出:

F   1   2   3   4    
A   1   5   9   13
B   2   6   10  14
C   3   NA  7   11
D   NA  4   8   12

我的数据结构是:

SN : Chr "1.1", 100.1", "100.5" ...
F:  Factor w/24 levels ...
value: num ...

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我非常盲目地尝试自动化您的手动过程,但我认为它有效。如果您的数据非常大,那么肯定有提高make.sub()函数速度的方法,但我猜这对您来说不是问题。

#make funciton to make your subsets
make.sub <- function(sn){
  tmp <- x[x$SN==sn,]
  names(tmp)[2] <- sn
  return(tmp)
}

#apply function to get list of subsets
x.list <- lapply(unique(SN), make.sub)

#merge list of subsets
x.merged <- Reduce(function(...) merge(..., by="F"), x.list)

正如您所看到的,这会产生与手动过程相同的结果。

> x.merged
  F SN.x 1 SN.y 2 SN.x  3 SN.y  4
1 A    1 1    2 5    3  9    4 13
2 B    1 2    2 6    3 10    4 14
> x_all
  F SN.x 1 SN.y 2 SN.x  3 SN.y  4
1 A    1 1    2 5    3  9    4 13
2 B    1 2    2 6    3 10    4 14

答案 1 :(得分:1)

同样,与其他海报一样,我很不确定你在问什么,但这是我对你要做的事情的解释:

require(reshape2)
dcast( x , F ~ SN , value.var = "value" )
#  F 1 2  3  4
#1 A 1 5  9 13
#2 B 2 6 10 14
#3 C 3 0  7 15
#4 D 0 4  8 12

唯一的SN是列名,行是F,值是值列中的相应值。但是,如果SN-F组合有多个值(对于SN = 4和F = C,您有11和15),则取max值。

HTH

答案 2 :(得分:0)

我不确定我是否得到了你的任务,但我希望这段代码有效:

x<-data.frame(SN=rep(1:4,c(3,3,4,5)),value=1:15,F=rep(c(LETTERS[1:4]), each = 1, len = 15))

SN<-unique(x$SN)
for (i in 1:length(SN)){
  xi<-x[x$SN==SN[i],]  
  colnames(xi)[2]<-paste("SN",i,sep=".")
  xi<-xi[,c(3,2)]
  if (i==1){x_all<-xi}
  if (i>1){
  x_all<-merge(x_all,xi,by="F")
  }
}
head(x_all)