我有重塑数据的问题;以下是我的示例数据集。
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 ...
感谢您的帮助!
答案 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)