我需要转换一些这样的数据:
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
有没有办法用B4
填充丢失的NA
行,或者只是忽略它? t
函数或ddply
似乎对B
与其他{{1}}长度不同的事实感到窒息。
谢谢, 的J -
答案 0 :(得分:3)
与@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
您想要的并不是很清楚,因为示例中的行标有井号,而代码则表示按复合名称拆分。不确定你真正想要的是什么。
答案 1 :(得分:1)
您希望您的行和列是Well列中的字母和数字是否正确?您可以将它们拆分为两个新列:
well.split <- strsplit(df$Well, '')
df$well.letter <- sapply(well.split, '[', 1)
df$well.number <- sapply(well.split, '[', 2)
然后我会使用dcast
包中的reshape2
:
dcast(df, well.letter~well.number, value.var='Result')