Выбор между дублирующимися данными во фрейме данных - PullRequest
4 голосов
/ 21 октября 2011

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

Дубликаты записей в этом наборе данных имеют одинаковые значения 'Assay' и 'Sample'. Вот первые 10 строк нового набора данных, с которым я работаю и который содержит мои повторяющиеся записи:

     Assay   Sample    Genotype   Data
1  CCT6-002   1486         A        1
2  CCT6-002   1486         G        0
3  CCT6-002   1997         G        0
4  CCT6-002   1997         NA       NA
5  CCT6-002   0050         G        0
6  CCT6-002   0050         G        0
7  CCT6-015   0082         G        0
8  CCT6-015   0082         T        1
9  CCT6-015   0121         G        0
10 CCT6-015   0121         NA       NA

Я бы хотел запустить скрипт, который будет разбивать эти дубликаты выборок на 4 ячейки на основе значения «Данные», которое может быть равно 1, 0 или NA:

 1) All values for 'Data' are NA
 2) All values for 'Data' are identical, no NA
 3) At least 1 value for 'Data' is not identical, no NA.
 4) At least 1 value for 'Data' is not identical, at least one is NA.

Ожидаемый результат из приведенных выше данных будет выглядеть так:

Set 1
Null

Set 2
5  CCT6-002   0050         G        0
6  CCT6-002   0050         G        0

Set 3
1  CCT6-002   1486         A        1
2  CCT6-002   1486         G        0
7  CCT6-015   0082         G        0
8  CCT6-015   0082         T        1

Set 4
3  CCT6-002   1997         G        0
4  CCT6-002   1997         NA       NA
9  CCT6-015   0121         G        0
10 CCT6-015   0121         NA       NA

Существуют случаи, когда в этом наборе данных существует более 2 «дублирующих» точек данных. Я не уверен даже, с чего начать, так как я новичок в R.

РЕДАКТИРОВАТЬ: с ожидаемыми данными.

Ответы [ 2 ]

4 голосов
/ 21 октября 2011

Вы задали вопрос, который меняет направление на то, чтобы попросить других сделать всю вашу работу за вас.Вопрос об одном конкретном фрагменте этого проекта, вероятно, скорее всего привлечет ответ.Часть, с которой вы боретесь, которая мешает вам начать, является очень базовым навыком программирования: способность разбить вашу проблему на маленькие конкретные шаги, решить каждую из них по отдельности, а затем соединить их снова, чтобы решить вашу первоначальную проблему .

Этот навык также очень сложен в изучении.Но у тебя хорошее начало!Вы правильно определили четыре группы, в которые могут попасть ваши данные:

  1. Все значения для «данных» равны NA

  2. Все значения для «данных»'идентичны, нет NA

  3. По крайней мере, 1 значение для «Данные» не является идентичным, нет NA.

  4. По крайней мере, 1 значение для «данных» не является идентичным, по крайней мере, одно - NA.

Теперь вам нужно подумать о том, как,если у вас есть только одно подмножество ваших данных, можете ли вы выяснить, как определить в R, в какую группу (1-4) они входят?Ниже приведен набросок некоторых инструментов, которые могут быть полезны для этого.Создайте несколько подмножеств и поэкспериментируйте в консоли, пока не почувствуете себя комфортно при определении каждой группы:

(1) Все ли значения для datSub$Data NA s?

Инструменты: allи is.na

(2) Только одно уникальное значение, а не NA?

Инструменты: length, unique, is.na, any

(3) Более одного уникального значения, нет NA с?

Инструменты: length, unique, any, is.na

(4) Ещеодно уникальное значение, по крайней мере одно NA?

Инструменты: length, unique, any, is.na

Это может быть возможно сделать без использованиявсе эти функции, но все они потенциально полезны.

Как только вы узнаете, как определить, в какую группу должен входить конкретный поднабор, вы готовы заключить этот код в функцию.Я бы предложил создать новый столбец со значением 1-4, в зависимости от того, в какую группу входит это подмножество:

myFun <- function(x){
    if (...){
        x$grp <- 1
    }
    if (...){
        x$grp <- 2
    }
    #etc.

    return(x)
}

Затем используйте ddply, чтобы применить эту функцию к каждому подмножеству ваших данных на основезначения Sample:

ddply(dat,.(Sample),.fun = myFun)

И, наконец, разделить этот фрейм данных на его новую переменную grp:

split(dat,dat$grp)

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

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

3 голосов
/ 21 октября 2011

Это должно быть хорошим началом. В зависимости от того, как долго ваш набор данных, может стоить или не стоить оптимизировать это для лучшей скорости.

require(plyr)

# Read data
data = read.table('data.txt', colClasses=c(NA, NA, 'character', NA, NA))

# Function to pick set
pickSet <- function(x) {
  if(all(is.na(x$Data))) {
    set = 1
  } else if(length(unique(x$Data)) == 1) {
    set = 2
  } else if(!any(is.na(x$Data))) {
    set = 3
  } else {
    set = 4
  }
  data.frame(Set=set)
}

# Identify Set for each combo of Assay and Sample
sets = ddply(data, c('Assay', 'Sample'), pickSet)

# Merge set info back with data
data = join(data, sets)

# Reformat to list
sets.list = lapply(1:4, function(x) data[data$Set==x,-5])
> sets.list
[[1]]
[1] Assay    Sample   Genotype Data    
<0 rows> (or 0-length row.names)

[[2]]
     Assay Sample Genotype Data
5 CCT6-002   0050        G    0
6 CCT6-002   0050        G    0

[[3]]
     Assay Sample Genotype Data
1 CCT6-002   1486        A    1
2 CCT6-002   1486        G    0
7 CCT6-015   0082        G    0
8 CCT6-015   0082        T    1

[[4]]
      Assay Sample Genotype Data
3  CCT6-002   1997        G    0
4  CCT6-002   1997     <NA>   NA
9  CCT6-015   0121        G    0
10 CCT6-015   0121     <NA>   NA
...