2

質問の後に質問が殺到してすみません。検索に最善を尽くしていますが、非常に大規模なプログラムを作成するという骨の折れる作業があり、Rはまだ非常に新しいので、これまでに得たすべての迅速な支援に感謝します。

問題を実証するための偽の例

Gene <- c("A","B","C","A","B","C","A","B","C")
> IntensityValue <- c(1,10,20,3,NA,23,NA,NA,22)
> ProceedTest <- c(2,2,2,2,-1,2,-1,-1,2)
> ExampleData <- list(Gene=Gene, IntensityValue=IntensityValue, ProceedTest=ProceedTest)
> ExampleData <- as.data.frame(ExampleData)
> ExampleData
Gene IntensityValue ProceedTest
 A              1           2
 B             10           2
 C             20           2
 A              3           2
 B             NA          -1
 C             23           2
 A             NA          -1
 B             NA          -1
 C             22           2

ProceedTestは、テストを続行する必要があるかどうかを示すスコアです。スコア2は、データが考慮されることを意味し、スコア-1は、テストがデータを考慮しないことを意味します。

遺伝子BにはNAが2回出現し、AにはNAが1回だけ出現することに気付くでしょう。遺伝子Bの場合、NAが2回出現することをRに認識してもらいたい。与えられた遺伝子(B)に対してNAが2回現れるときはいつでも、ゼロの値がNAを置き換え、後続の-1が2に変わります。RにAのNAを無視して、続行してテストを続行するようにします。値はそのままです。

変更されたデータは次のようになります。

Gene IntensityValue ProceedTest
  A              1           2
  B             10           2
  C             20           2
  A              3           2
  B              0           2
  C             23           2
  A             NA          -1
  B              0           2
  C             22           2

これは不可能かもしれませんが、可能であれば、遺伝子のNAがない場合、ProceedTestの値は-1になります。

Final Dataset
 Gene IntensityValue ProceedTest
  A              1           2
  B             10           2
  C             20          -1
  A              3           2
  B              0           2
  C             23          -1
  A             NA          -1
  B              0           2
  C             22          -1

要約すれば。遺伝子AにはNAが1つしかないため、何も変わりません。遺伝子Bには2つのNA値があるため、すべて2を取得し、強度値の列でNAがゼロになります。遺伝子CはNAを含まないため、-1になります(強度値を変更することは実際には重要ではありません)。

これが明確であることを願っています。また、他の質問が少し簡単になったことも知っているので、この特定の質問がそれほど単純ではなく、自分で答えを見つけるためにさらに調査を行う必要があったことを願っています。

事前に助けてくれてありがとう、

ジョー

4

2 に答える 2

2

data.frameの順序を気にしない場合はddply、パッケージから次plyrのトリックを実行できます。

ddply(ExampleData, "Gene", function(dfr){
        #here, dfr is the part of your original data.frame
        #only for the 'current value' of Gene
        numNA<-sum(is.na(dfr$IntensityValue))
        if(numNA>1)
        {
            dfr$IntensityValue<-0
            dfr$ProceedTest<-2
        }
        else if(numNA==0)
        {
            dfr$ProceedTest<- -1
        }
        dfr
    })

しかし、他にも多くの解決策があります。

于 2011-07-04T06:53:01.693 に答える
0

これを行うには、ほぼ確実により効率的な方法があることに注意してください(データに各遺伝子の繰り返しが多い場合、カウントを含む非常に凝縮されたdata.frameのマージ操作の複製は、多くのメモリを消費します):

Gene <- c("A","B","C","A","B","C","A","B","C")
IntensityValue <- c(1,10,20,3,NA,23,NA,NA,22)
ProceedTest <- c(2,2,2,2,-1,2,-1,-1,2)
ExampleData <- list(Gene=Gene, IntensityValue=IntensityValue, ProceedTest=ProceedTest)
ExampleData <- as.data.frame(ExampleData)
ExampleData

num.na <- function(x) {
  sum(is.na(x))
}
ED.numna <- by(data=ExampleData,Gene,num.na)
# res.name is what you want the result column to be named
  #ideally would pull this from the call via something like as.character(attr(x,"call"))
as.data.frame.by <- function(x,res.name=NA) {
  stopifnot(length(dimnames(x))==1) # Only 1d case handled for now
  df <- data.frame(by = names(x), res = as.numeric(x) )
  names(df)[names(df)=="by"] <- names(dimnames(x))
  if(!is.na(res.name)) {
    names(df)[names(df)=="res"] <- res.name
  }
  df
}
ExampleData <- merge(ExampleData,as.data.frame(ED.numna,"count"))
ExampleData$IntensityValue[ExampleData$count > 1] <- 0
于 2011-07-04T07:12:08.390 に答える