[R采用“T”与ddply

问题描述:

我需要改变一些数据是这样的:[R采用“T”与ddply

df<-data.frame(Plate=c("4660", "4660", "4660", "4660", "4660", "4660", "4660", "4660", "4660", "4660", "4660"), Well=c("A1", "A2", "A3", "A4", "B1", "B2", "B3", "C1", "C2", "C3", "C4"), Result=c(1, 10, 100, 1000, 1, 10, 100, 1, 10, 100, 1000), Compound=c("C1", "C1", "C1", "C1", "C2", "C2", "C2", "C3", "C3", "C3", "C3")) 
cmpds <- ddply(df, .(Compound), .fun = "t") 

我想直到结束是这样的:

1  2  3  4 
A 1  10 100 1000 
B 1  10 100 NA 
C 1  10 100 1000 

有没有办法来填补缺少B4NA还是忽略它? t函数或ddply似乎令人窒息的事实B是一个不同于其他长度的事实。

感谢, J--

+0

对不起,我的专栏没有完全排列,但你明白了。三行(A,B,C)和4列(1,2,3,4)。 – James

像@Justin,我假设你的列名来自数字来了井规范的一部分。如果是这样,这里是一个稍微更通用的解决方案(将非单个数字和非单个字母,嗯,字母工作

library("gsubfn") 
library("reshape2") 

wells <- strapply(as.character(df$Well), ".*([A-Z]+)([0-9]+)", c, simplify=rbind) 
colnames(wells) <- c("well.letter", "well.number") 
df <- cbind(df, wells) 

然后使用dcast

> dcast(df, Compound~well.number, value.var="Result") 
    Compound 1 2 3 4 
1  C1 1 10 100 1000 
2  C2 1 10 100 NA 
3  C3 1 10 100 1000 

如果水平标签是毫无意义的,你只是想填多少以往任何时候都重视你,你可以用plyr做到这一点:

ddply(df, .(Compound), function(DF) { 
    as.data.frame(t(DF$Result)) 
}) 

这给

Compound V1 V2 V3 V4 
1  C1 1 10 100 1000 
2  C2 1 10 100 NA 
3  C3 1 10 100 1000 

你想要的东西不是很清楚,因为你的例子中的行标有井字母,而代码意味着按化合物名称分割。不确定你真的想要什么。

您希望您的行和列是从井柱正确的字母和数字?您可以拆分那些伸到两个新列:

well.split <- strsplit(df$Well, '') 

df$well.letter <- sapply(well.split, '[', 1) 
df$well.number <- sapply(well.split, '[', 2) 

然后我会使用dcastreshape2包:

dcast(df, well.letter~well.number, value.var='Result')