2013-12-16 2 views
0

У меня есть файл, который выглядит следующим образом: (примечание: мой фактический файл имеет размеры 1000x5000, поэтому я сделал короткую версию здесь)расчет коэффициентов конкордантности в дублированных образцах в панде в питоне или в R

>duplicates 

markerid 1A 1B 2A 2B 3A 3B 
rs1512  CC CC CT CC CC TT 
rs1779  TT TG TG TT -- TG 
rs12743  TT TG TG TT TT TT 
rs13229  CC GC CC -- CC CC 
rs1328  CC CC GG GG CG CG 

В первой колонке содержатся идентификаторы маркеров, для которых был проверен каждый человек. В последующих столбцах содержатся лица, проверенные в дубликатах.

Например, 1A и 1B являются дубликатами образца 1. То же самое относится к 2A и 2B, 3A и 3B.

Я пытаюсь получить дублируемую скорость согласования на образец. То есть, я хочу знать пропорцию времени, в течение которого буквы-маркериды для образца 1А такие же, как для образца 1В, затем сравнивают образцы 2А и 2В и получают скорости согласования и так далее.

Так, например, для образцов 1А и 1В они соответствуют только 4/5 маркеридам.

Я хочу, чтобы генерировать конечный выходной файл, который имеет очень простой формат:

>concordance_rate 
concordance 
0.8 
0.2 
0.6 

В случае, если первая строка является скорость конкорданс для образца 1, вторая строка скорости конкорданс для образца 2, и так далее.

Я думаю, что способ сделать это состоял бы в подсчете количества раз, когда столбец2 соответствует colum3, а затем разделите его на длину любого столбца, а затем сделайте это в цикле для последующих наборов из двух столбцов в кадре данных. Но я честно застрял в том, как правильно закодировать, поэтому я прошу помощи. Я изучаю программирование (в R и используя модуль pandas на Python) медленно, поэтому помощь будет принята с благодарностью. Спасибо.

ответ

1

Это сделает эту работу. Обратите внимание, что мои данные не точно такие же, как у вас, но 1A и 1B соответствуют 3/5 случаям и 2A и 2B соответствуют 4/5 случаям.

markers = data.frame(
"1A" = c("CC", "TT", "TT", "CC", "CC"), 
"1B" = c("CC", "TG", "TT", "CG", "CC"), 
"2A" = c("CC", "TT", "TT", "CC", "CC"), 
"2B" = c("CC", "TT", "TT", "CC", "CG"), 
stringsAsFactors = FALSE 
) 
# 
concordance = sapply(seq(1, ncol(markers), 2), function(c) { 
    match = sum(markers[, c] == markers[, c+1])/nrow(markers) 
}) 
print(concordance) 

Выход

> print(concordance) 
[1] 0.6 0.8 

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

+0

спасибо. это сработало – CadisEtRama

 Смежные вопросы

  • Нет связанных вопросов^_^