5

SO ユーザーからの複数の提案の後、私は最終的に自分のコードを を使用するように変換しようとしていますdata.table

library(data.table)
DT <- data.table(plate = paste0("plate",rep(1:2,each=5)),
             id = rep(c("CTRL","CTRL","ID1","ID2","ID3"),2),
             val = 1:10)

> DT
    plate   id val
1: plate1 CTRL   1
2: plate1 CTRL   2
3: plate1  ID1   3
4: plate1  ID2   4
5: plate1  ID3   5
6: plate2 CTRL   6
7: plate2 CTRL   7
8: plate2  ID1   8
9: plate2  ID2   9
10: plate2  ID3  10

私がやりたいのはDT[,val]、IDが「CTRL」の場合のプレートごとの平均を取ることです。

私は通常aggregate、データフレームを使用matchして、値を新しい列「ctrl」にマップし直します。

data.table私が得ることができるパッケージを使用して:

DT[id=="CTRL",ctrl:=mean(val),by=plate]

> DT
    plate   id val ctrl
1: plate1 CTRL   1  1.5
2: plate1 CTRL   2  1.5
3: plate1  ID1   3   NA
4: plate1  ID2   4   NA
5: plate1  ID3   5   NA
6: plate2 CTRL   6  6.5
7: plate2 CTRL   7  6.5
8: plate2  ID1   8   NA
9: plate2  ID2   9   NA
10: plate2  ID3  10   NA

私が本当に必要なのは:

DT <- data.table(plate = paste0("plate",rep(1:2,each=5)),
                 id = rep(c("CTRL","CTRL","ID1","ID2","ID3"),2),
                 val = 1:10,
                 ctrl = rep(c(1.5,6.5),each=5))

> DT
    plate   id val ctrl
1: plate1 CTRL   1  1.5
2: plate1 CTRL   2  1.5
3: plate1  ID1   3  1.5
4: plate1  ID2   4  1.5
5: plate1  ID3   5  1.5
6: plate2 CTRL   6  6.5
7: plate2 CTRL   7  6.5
8: plate2  ID1   8  6.5
9: plate2  ID2   9  6.5
10: plate2  ID3  10  6.5

最終的には、より複雑な値の選択を使用したいと思いますが、特定の値を選択し、関数を実行してから、データ フレームを使用してそれらの値を適切な行にマップする方法がわかりません。

4

1 に答える 1

7

これはあなたがしたいことです:

DT[,ctrl:=mean(val[id=="CTRL"]),by=plate]

を与える

     plate   id val ctrl
 1: plate1 CTRL   1  1.5
 2: plate1 CTRL   2  1.5
 3: plate1  ID1   3  1.5
 4: plate1  ID2   4  1.5
 5: plate1  ID3   5  1.5
 6: plate2 CTRL   6  6.5
 7: plate2 CTRL   7  6.5
 8: plate2  ID1   8  6.5
 9: plate2  ID2   9  6.5
10: plate2  ID3  10  6.5

の最初の引数を使用すると、サブセット化するため、元のコードはtrueDT[id=="CTRL",ctrl:=mean(val),by=plate]ではない行の割り当てを行いませんでした。2 番目の引数の操作は、サブセット化された に対してのみ行われます。id=="CTRL"[data.table

于 2013-11-07T21:35:27.883 に答える