Сравнение двух столбцов во фрейме данных по множеству строк

У меня есть фрейм данных, с которым я работаю, в котором я хотел бы сравнить точку данных Genotype с двумя ссылками S288C и SK1. Это сравнение будет выполнено по многим строкам (более 100) кадра данных. Вот несколько первых строк моего фрейма данных:

    Assay   Genotype S288C SK1
1   CCT6-002     G     A    G
2   CCT6-007     G     A    G
3   CCT6-013     C     T    C
4   CCT6-015     G     A    G
5   CCT6-016     G     G    T

В качестве конечного продукта мне нужна символьная строка из единиц (S288C) и нулей (SK1) в зависимости от того, какой из ссылок соответствует точка данных. Таким образом, в приведенном выше примере я хотел бы, чтобы на выходе было 00001, поскольку все, кроме последнего совпадения SK1.


person Sam Globus    schedule 04.10.2011    source источник
comment
Что вы сравниваете и как проводить сравнение? Дайте нам образец вывода, который соответствует вашему образцу ввода.   -  person    schedule 04.10.2011
comment
Я сравниваю генотип с каждым из следующих двух столбцов S288C и SK1. Когда Genotype идентичен S288C id, как вывод 1, а когда он идентичен SK1, id как вывод 0. Если он не совпадает ни с одним NA. Я бы хотел, чтобы это сравнение происходило в каждой строке. Это помогает?   -  person Sam Globus    schedule 04.10.2011
comment
7000-й вопрос ?!   -  person Jason B    schedule 05.10.2011


Ответы (1)


Вложенный ifelse должен делать это (обратите внимание на help(ifelse) для использования):

ifelse(dat$Genotype==dat$S288C,1,ifelse(dat$Genotype==dat$SK1,0,NA))

С этими тестовыми данными:

> dat
     Genotype S288C SK1
[1,] "G"      "A"   "G"
[2,] "G"      "A"   "G"
[3,] "C"      "T"   "C"
[4,] "G"      "A"   "G"
[5,] "G"      "G"   "T"
[6,] "G"      "A"   "A"

Мы получаем:

> ifelse(dat$Genotype==dat$S288C,1,ifelse(dat$Genotype==dat$SK1,0,NA))
[1]  0  0  0  0  1 NA

(Примечание: если у вас возникли проблемы с его использованием, вы захотите убедиться, что столбцы являются векторами и не обрабатываются R как факторы ... простой цикл for должен это сделать: for (i in 1:ncol(dat)){dat[,i]=as.vector(dat[,i])} ).

person Community    schedule 04.10.2011
comment
Это сработало отлично. Спасибо! Если бы я хотел добавить результаты в виде нового столбца во фрейм данных (т.е. после столбца SK1), как бы я это сделал? Извините, если это базовый вариант, но я новичок в R и программировании в целом. - person Sam Globus; 05.10.2011
comment
Функция cbind должна работать: newdat<-as.data.frame(cbind(dat,ifelse(dat$Genotype==dat$S288C,1,ifelse(dat$Genotype==dat$SK1,0,NA)))). - person ; 05.10.2011
comment
когда я запускаю указанную выше функцию cbind, она возвращает мне то, что выглядит как двухчастный фрейм данных. Первая часть - это исходный фрейм данных, вторая - это вызовы, сделанные на указанном выше языке с соответствующим номером строки. Есть ли способ выровнять все это в одном фрейме данных? - person Sam Globus; 06.10.2011