1

次のようなデータを変換する必要があります。

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

ありがとう、J--

4

2 に答える 2

3

@Justinのように、私はあなたの列名が井戸仕様の数値部分から来ていると仮定しています。もしそうなら、ここにもう少し一般的な解決策があります(1桁以外の数字と1文字以外の文字、ええと、文字に対して機能します。

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

あなたの例の行はウェル文字でラベル付けされているので、あなたが望むものは本当に明確ではありませんが、コードは複合名で分割することを意味します。本当に欲しいものがわからない。

于 2012-05-24T18:10:25.833 に答える
1

行と列を Well 列の文字と数字にしたいですか? これらを 2 つの新しい列に分割できます。

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')
于 2012-05-24T17:50:22.577 に答える