Сопоставление с образцом в контексте фрейма данных - PullRequest
6 голосов
/ 27 октября 2011

У меня есть фрейм данных, первые 5 строк которого выглядят следующим образом:

Sample    CCT6        GAT1                   IMD3          PDR3          RIM15
001       0000000000  111111111111111111111  010001000011  0N100111NNNN  01111111111NNNNNN
002       1111111111  111111111111111111000  000000000000  0N100111NNNN  00000000000000000
003       0NNNN00000  000000000000000000000  010001000011  000000000000  11111111111111111
004       000000NNN0  11100111111N111111111  010001000011  111111111111  01111111111000000
005       0111100000  111111111111111111111  111111111111  0N100111NNNN  00000000000000000

Полный набор данных имеет 2000 образцов. Я пытаюсь написать код, который позволил бы мне сказать, является ли строка чисел для каждого из 5 столбцов однородной (то есть все 1 или 0) во всех моих образцах. В идеале я также хотел бы иметь возможность различать от 1 до 0 в случаях, когда ответом является True. Из моего примера ожидаемые результаты будут:

Sample    CCT6        GAT1         IMD3          PDR3          RIM15
001       TRUE (0)    TRUE (1)     FALSE         FALSE         FALSE
002       TRUE (1)    FALSE        TRUE (0)      FALSE         TRUE (0)
003       FALSE       TRUE (0)     FALSE         TRUE (0)      TRUE (1)
004       FALSE       FALSE        FALSE         TRUE (1)      FALSE
005       FALSE       TRUE (1)     TRUE (1)      FALSE         TRUE (0)

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

У меня проблемы с самым основным первым шагом, который заключается в том, чтобы R сказал, состоит ли строка из всех одинаковых значений. Я пытался использовать различные выражения, используя grep и regexpr, но не смог получить результат, который я могу использовать, чтобы применить весь кадр данных, используя ddply или что-то подобное. Вот несколько примеров того, что я пробовал на этом шаге:

a = as.character("111111111111")
b = as.character("000000000000")
c = as.character("000000011110")


> grep("1",a)
[1] 1

> grep("1",c)
[1] 1

> regexpr("1",a)
[1] 1
attr(,"match.length")
[1] 1
> regexpr("1",c)
[1] 8
attr(,"match.length")
[1] 1

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

Ответы [ 3 ]

5 голосов
/ 27 октября 2011

Вот выражение REGEX, которое будет соответствовать нулям или единицам с одним или несколькими символами:

(^[0]+$)|(^[1]+$)

Будет соответствовать следующее: 0000 0 111111 11 1

Это не будет совпадать: 000001

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

Вот полное решение.Вероятно, излишне, но тоже весело.

Бит ключа - это функция markTRUE.Он использует обратную ссылку (\\1) для ссылки на подстроку (либо 0, либо 1), которая ранее соответствовала первому заключенному в скобки подвыражению.

Регулярное выражение "^(0|1)(\\1)+$" говорит 'соответствует любой строке, которая начинается с 0 или 1, а затем (до конца строки) сопровождается 1 или более повторениями одного и того же символа--- что бы это ни было '.Позже в том же вызове gsub() я использую ту же обратную ссылку для замены либо "TRUE (0)", либо "TRUE (1)", в зависимости от ситуации.

Сначала прочитайте данные:

dat <- 
read.table(textConnection("
Sample     CCT6        GAT1                   IMD3           PDR3          RIM15
001       0000000000  111111111111111111111  010001000011  0N100111NNNN  01111111111NNNNNN
002       1111111111  111111111111111111000  000000000000  0N100111NNNN  00000000000000000
003       0NNNN00000  000000000000000000000  010001000011  000000000000  11111111111111111
004       000000NNN0  11100111111N111111111  010001000011  111111111111  01111111111000000
005       0111100000  111111111111111111111  111111111111  0N100111NNNN  00000000000000000"),
header=T)

Затем раскройте регулярные выражения:

markTRUE <- function(X) {
    gsub(X, pattern = "^(0|1)(\\1)+$", 
         replacement = "TRUE (\\1)")
}

markFALSE <- function(X) {
    X[!grepl("TRUE", X)]  <- "FALSE"
    return(X)
}

dat[-1] <- lapply(dat[-1], markTRUE)
dat[-1] <- lapply(dat[-1], markFALSE)

dat
#   Sample     CCT6     GAT1     IMD3     PDR3    RIM15
# 1      1 TRUE (0) TRUE (1)    FALSE    FALSE    FALSE
# 2      2 TRUE (1)    FALSE    FALSE    FALSE TRUE (0)
# 3      3    FALSE TRUE (0)    FALSE TRUE (0) TRUE (1)
# 4      4    FALSE    FALSE    FALSE TRUE (1)    FALSE
# 5      5    FALSE TRUE (1) TRUE (1)    FALSE TRUE (0)
2 голосов
/ 27 октября 2011

Один из возможных подходов - использовать strsplit и unique:

> unique(unlist(strsplit("111111111122","")))
[1] "1" "2"

, а затем проверить, имеет ли результат длину один, и если это так, является ли он "1" или"0".

...