Назначение значений на основе количества дубликатов символов - PullRequest
2 голосов
/ 04 июля 2011

Извините за всплеск вопроса за вопросом.Я стараюсь изо всех сил искать, но у меня есть трудная задача - придумать очень, очень большую программу, и я все еще плохо знаком с 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, появляются дважды, а A имеет NA, появляются только один раз.Я хотел бы, чтобы R мог распознать, что для гена B NA появляется дважды.Таким образом, что каждый раз, когда NA появляется дважды для данного гена (B), нулевое значение заменяет NA, а последующее -1 превращается в 2. Я хочу, чтобы R игнорировал NA для A и продолжал выходить из теста Приступитьзначения как есть.

Измененные данные должны выглядеть следующим образом:

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

В итоге.Ген А имеет только одну НК, поэтому ничего не меняется.Ген B имеет два значения NA, поэтому он получает все 2, и NA становятся нулями в столбце значений интенсивности.Ген C становится -1, потому что он не содержит никакого NA (на самом деле не имеет значения изменять значения интенсивности).

Я надеюсь, что это понятно, я также знаю, что мои другие вопросы были немного проще, поэтому я надеюсь, что этот конкретный вопрос не так прост, когда я должен был провести дополнительные исследования, чтобы найти ответ на мойсобственные.

Заранее спасибо за помощь,

Джо

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Если вам не важен порядок вашего 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
    })

Хотя есть много других решений.

0 голосов
/ 04 июля 2011

С оговоркой, что почти наверняка есть более эффективные способы сделать это (если ваши данные имеют много повторов для каждого гена, дублирование операции слияния очень сжатых данных. Рамка, содержащая счетчики, съест много памяти):

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
...