检测列中的不同级别

时间:2013-04-11 10:10:49

标签: r

我确实有一个大约有80个条目的列,它只有22个不同的级别(染色体的数量)。在 R 中是否有任何快速技巧可以找出一个水平变为下一个位置的位置...以便弄清楚哪一行染色体1变为染色体2(单个染色体的所有条目都是列在一起)?

我的数据如下:

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

感谢

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用unique R:

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

匹配在它的第二个参数中返回它的第一个参数的第一个匹配位置的向量。这是有效的,因为染色体的所有条目都列在一起。

答案 2 :(得分: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