1

我在重塑数据时遇到问题;以下是我拥有的示例数据集。

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 数据的列重新创建数据,然后在“值”中分配具有该 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 ...

谢谢您的帮助!

4

3 回答 3

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
于 2013-06-04T21:36:23.323 回答
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值。

高温高压

于 2013-06-04T21:50:59.300 回答
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)
于 2013-06-04T21:35:36.690 回答