2013-04-11 19 views
-1

我確實有一個大約80k條目的列,其中只有22個不同級別(染色體數目)。在R有沒有什麼快速的技巧來找出哪一個位置的水平變化到下一個...所以要弄清楚哪條第1條染色體變成第2條染色體(單條染色體的所有條目都一起列出)?檢測列中的不同級別

我的數據是這樣的:

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

感謝

+2

你能發表一個你的數據的例子嗎? – user1981275 2013-04-11 10:15:35

回答

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

你好,我的問題是,每個染色體的標記數量不是恆定的,第1個字母大約有3k字符2個字節......沒有每個參數都能工作嗎? – 2013-04-11 10:19:51

+0

這是否意味着cumsum(rles $長度)可以完成這項工作?所以不是每個元素都需要有相同的長度(例如在你的例子中重複3次)? – 2013-04-11 10:23:58

+0

您沒有提供[可重現的示例](tinyurl.com/reproducible-000),所以我只是舉了一個例子。 'x < - rep(LETTERS [1:22],each = 3)'只是生成示例數據 - 如果您對此不滿意,請在您的問題中編寫自己的示例。 'rle()'與'cumsum()'結合在一起完成這項工作,給你在變化之前的最後位置。 – EDi 2013-04-11 12:57:46

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

這將如何返回我在染色體中切換的精確值? – 2013-04-11 10:22:15

+0

@TimHeinert:給你增加了更多的解釋和替代解決方案。 – 2013-04-11 10:32:59

1

您可以使用uniquematchbase R:

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

匹配返回第一匹配它的位置的矢量的第一個論點在它的第二個參數。這是有效的,因爲你所有的染色體條目都被列在一起。

+0

在這種情況下,數據只會成爲我的第一個專欄嗎? – 2013-04-11 10:24:59

+0

@TimHeinert是的,確切的!所以在你的情況'匹配(獨特(mydata $ chr),mydata $ chr)' – 2013-04-11 10:25:18