Как разделить данные, используя несколько символов в столбце

Это очень простой вопрос.

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

Пример данных:

> NL

SNP alleles

rs1234 A_T

rs1235 A_G

rs2343 A_T

rs2342 G_C

rs1134 C_G

rs1675 T_A

rs8543 A_T

rs2842 G_A

P <- subset(NL, alleles = "A_T", alleles = "T_A", alleles = "G_C", alleles = "C_G")

Это выполняется без ошибок, но результирующий P никоим образом не является подмножеством (хвост P по-прежнему показывает то же количество записей, что и исходный NL).

Что я делаю неправильно?


person mfk534    schedule 21.02.2012    source источник
comment
Вы хотите, чтобы ваш subset был аллелем in vector c('A_T','T_A','G_C','C_G')? P.S. это загадка намеков.   -  person Justin    schedule 22.02.2012


Ответы (2)


Самая очевидная ошибка - это использование «=», когда вы имеете в виду «==». Но я предполагаю из контекста, что вы действительно хотите «разделить» эти данные:

split(NL, NL$alleles)

Это создаст список фреймов данных, каждый из которых имеет одно из значений для alleles.

Но, возможно, вы захотите использовать сопоставление с образцом:

NL[ grepl("C_G|G_C|A_T|T_A", NL$alleles), ]
     SNP alleles
1 rs1234     A_T
3 rs2343     A_T
4 rs2342     G_C
5 rs1134     C_G
6 rs1675     T_A
7 rs8543     A_T

И иллюстрируя то, что я думаю, было вашим примером-комментарием:

P <- read.table(text="V1 V2 V3 V4 V5 V6 alleles
 15116 25 rsX 0 123412 G A G_A 
15117 25 rsX1 0 23432 A C A_C 
15118 25 rsX2 0 234324 A G A_G 
15119 25 rsX3 0 3423 A G A_G 
15120 25 rsX4 0 2343223 C A C_A 
15121 25 rsX5 0 23523423 A G A_G", header=TRUE)

 P[ grepl("G_A", NL$alleles), ]

#       V1       V2 V3        V4 V5 V6 alleles
# 15116 25 rs306910  0 154613671  G  A     G_A

Версия подмножества:

 subset(P, alleles %in% c("G_A", "A_G") )

      V1   V2 V3       V4 V5 V6 alleles
15116 25  rsX  0   123412  G  A     G_A
15118 25 rsX2  0   234324  A  G     A_G
15119 25 rsX3  0     3423  A  G     A_G
15121 25 rsX5  0 23523423  A  G     A_G
person IRTFM    schedule 21.02.2012
comment
Использование == дает мне следующую ошибку: Ошибка в [.data.frame (x, r, vars, drop = drop): объект «аллели» не найден Но я могу работать с разделением. Спасибо! - person mfk534; 22.02.2012
comment
@ user1224314 Если это так, то данные, которые вы указали в своем вопросе, отличаются от данных, с которыми вы работаете на своем компьютере. Мы можем помочь только на основе предоставленных вами примеров данных. - person joran; 22.02.2012
comment
@ user1224314 Убедитесь, что ваш объект NL является фреймом данных и что имя столбца аллелей - "alleles". Вы можете использовать str(NL), чтобы увидеть, какая у него структура, и names(NL), чтобы посмотреть имена столбцов. - person Gregor Thomas; 22.02.2012
comment
@ user1224314 Вы не объединили == с другими исправлениями, предоставленными вам в других комментариях и ответах. Не только ==. Попробуйте исправить все проблемы, поднятые здесь людьми, прежде чем пытаться снова. - person joran; 22.02.2012
comment
Несмотря на отсутствие форматирования в моем комментарии, вы меня слышали. Я не знал, что grep можно использовать в R. Это работает - спасибо! - person mfk534; 22.02.2012
comment
О, да, grepping очень хорошо используется в R, хотя обратите внимание, что я использовал grepl, который я считаю более безопасным для выбора. Это не зависит от его действительности от названий строк по умолчанию для фреймов данных. Смотрите также ?grep, ?regex и ?strsplit - person IRTFM; 22.02.2012

= используется для передачи аргументов или для присваивания. Что вам нужно, так это проверить, правда ли что-то, используйте ==. Вы также передаете несколько критериев и не указываете, как их следует комбинировать. Я почти уверен, что вам нужно подмножество, в котором выполняется любое из этих условий (не все), а R - нет. В этом случае вы можете использовать оператор %in%:

P <- subset(NL, alleles %in% c("A_T", "T_A", "C_G"))

Также обратите внимание, что вы пытаетесь задать subset несколько условий, но не говорите, как их комбинировать. Я вижу, что вам нужны строки, в которых выполняется любое из условий, но вы должны сообщить R, используя оператор OR, |, например.

P <- subset(NL, alleles == "A_T" | alleles == "T_A" | alleles == "C_G")

Вышеупомянутый оператор %in% является сокращением для этого.

person Gregor Thomas    schedule 21.02.2012