2013-04-11 2 views
-1

У меня есть столбец с около 80 тыс. Записей, который имеет только 22 разных уровня (количество хромосом). Есть ли какой-нибудь быстрый трюк в R, чтобы узнать, в какой позиции уровень изменяется в следующем ... так, чтобы выяснить, какая строка хромосомы 1 изменяется на хромосому 2 (все записи для одной хромосомы перечислены вместе)?Обнаружение разных уровней в столбце

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

chr number marker name (SNP) 
1    rs... 
1    rs... 
. 
. 
2 

благодаря

+2

Не могли бы вы привести пример ваших данных? – user1981275

ответ

0

Вы могли бы использовать rle для этого (если я получаю свой вопрос прямо):

x <- rep(LETTERS[1:22], each = 3) 
x 
# [1] "A" "A" "A" "B" "B" "B" "C" "C" "C" "D" "D" "D" "E" "E" "E" "F" "F" "F" "G" "G" "G" "H" "H" "H" #"I" "I" "I" "J" "J" "J" "K" "K" "K" "L" "L" "L" "M" "M" "M" "N" "N" "N" "O" "O" "O" "P" "P" "P" #"Q" "Q" "Q" "R" "R" "R" "S" "S" "S" "T" "T" "T" "U" "U" "U" "V" "V" "V" 
rles <- rle(x) 
cumsum(rles$lengths) 
# [1] 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 
+0

привет, моя проблема в том, что количество маркеров на хромосому не является постоянным, chr 1 имеет около 3k chr 2 еще ... делает rle также работать без каждого аргумента? –

+0

означает ли это, что cumsum (rles $ lengths) выполнит эту работу? так что не каждый элемент должен иметь одинаковую длину (например, 3 повторения в вашем примере)? –

+0

Вы не представили [воспроизводимый пример] (tinyurl.com/reproducible-000), поэтому я просто составил пример. 'x <- rep (LETTERS [1:22], each = 3)' просто генерирует данные примера - если ваш недовольный этим, составите свой собственный пример в своем вопросе. 'rle()' в сочетании с 'cumsum()' выполняет здесь задание, давая вам последнюю позицию перед изменением. – EDi

1

Проверить diff будучи отличным от нуля. Это возвращает логический вектор, который равен TRUE, когда последовательные значения не совпадают. Оберните его which, чтобы получить числовые знаки.

(x <- factor(sample(c("a", "b"), 15, replace = TRUE))) 
# [1] a a b b a a b b b b b a b a a 
# Levels: a b 
diff(as.integer(x)) != 0 
# [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE 
which(diff(as.integer(x)) != 0) 
# [1] 2 4 6 11 12 13 

Если все значения хромосом сгруппированы вместе, вы можете найти первый экземпляр каждого уровня с duplicated.

(x2 <- factor(rep(c("a", "b", "c"), times = c(3, 4, 6)))) 
# [1] a a a b b b b c c c c c c 
# Levels: a b c 
!duplicated(x2) 
# [1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
which(!duplicated(x2)) 
# [1] 1 4 8 
+0

как бы это вернуло мне точное значение, при котором происходит переключение в хромосомах? –

+0

@TimHeinert: добавлено больше объяснений для вас и альтернативное решение. –

1

Вы можете использовать unique и match из base R:

data <- c(rep("a",10),rep("b",5),rep("c",2),rep("d",10)) 
match(unique(data) , data) 
#[1] 1 11 16 18 

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

+0

в этом случае данные будут только моей первой колонкой, не так ли? –

+0

@TimHeinert да, точно! Итак, в вашем случае 'match (unique (mydata $ chr), mydata $ chr)' –

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