2016-06-22 9 views
3

Я хотел бы создать дихотомическую переменную, которая сообщает мне, дал ли участник один и тот же ответ на каждый из 10 вопросов. Каждая строка является участником, и я хочу написать простой скрипт для создания этой новой переменной/вектора в моем кадре данных. Например, если мои данные выглядят как первые 6 столбцов, то я пытаюсь создать 7-й.Как я могу написать скрипт R для проверки прямой подкладки; то есть, для любой заданной строки все значения в наборе столбцов имеют одинаковое значение.

ID Item1 Item2 Item3 Item4 Item5 | AllSame 
1 5  5  5  5  5  | Yes 
2 1  3  3  3  2  | No 
3 2  2  2  2  2  | Yes 
4 5  4  5  5  5  | No 
5 5  2  3  5  5  | No 

Я видел решения на этом множестве, сравнить один столбец в другой, например, здесь с ifelse(data$item1==data$item2,1,ifelse(dat$item1==data$item3,0,NA)), но у меня есть 10 колонок в моем фактическом наборе данных и я полагаю, там должен быть лучше, чем проверять все 10 друг против друга. Я также мог бы создать переменную aa, которая подсчитывает, сколько равных 1, а затем выполнить тест, если счетчик совпадает с числом столбцов, но с 7 возможными ответами в данных еще раз это выглядит очень нерешительно, и я надеясь, что у кого-то есть лучшее решение. Спасибо!

+0

Возможно, лучше в stackoverflow, так как это программирование, а не статистика. – Henry

+0

Как вы хотите, чтобы он вел себя, если в одной строке есть все значения «NA»? –

+0

Возможный дубликат [Проверка на равенство среди всех элементов одного вектора] (http://stackoverflow.com/questions/4752275/test-for-equality-among-all-elements-of-a-single-vector) –

ответ

4

Там будет много способов сделать это, но вот один

mydf <- data.frame(Item1 = c(5,1,2,5,5), 
        Item2 = c(5,3,2,4,2), 
        Item3 = c(5,3,2,5,3), 
        Item4 = c(5,3,2,5,5), 
        Item5 = c(5,3,2,5,5)) 

mydf$AllSame <- rowMeans(mydf[,1:5] == mydf[,1]) == 1 

, что приводит к

> mydf 
    Item1 Item2 Item3 Item4 Item5 AllSame 
1  5  5  5  5  5 TRUE 
2  1  3  3  3  3 FALSE 
3  2  2  2  2  2 TRUE 
4  5  4  5  5  5 FALSE 
5  5  2  3  5  5 FALSE 

И если вы действительно должны быть «Да» и «Нет», а затем использовать вместо что-то вроде

mydf$AllSame <- ifelse(rowMeans(mydf[,1:5] == mydf[,1]) == 1, "Yes", "No") 
+0

Это сработало и просто хочу, чтобы я пытался добраться, спасибо! Мне совсем не нужны Да и Нет, хотя после того, как вы разместили этот сценарий, я изменил его на 1 и 0, так как это облегчит анализ. Обратите внимание, что для тех, кто нашел это позже, чтобы избежать проблемы, которую я имел вначале: номер в '== mydf [, 1]' должен быть первым столбцом, на который вы смотрите; Я сохранил это как 1, так как я не знал, что он делает, и все мои ответы были 0 вначале. Например. мой последний код был «data $ SL_set1 <- ifelse (rowMeans (data [, 28: 37] == data [, 28]) == 1, 1, 0)' – Bofstein

+0

Я пытаюсь выяснить, как эта формула работает поэтому я понимаю, что этого достаточно, чтобы изменить его, например для строковых переменных (что я не думаю, что это может сделать) или для отсутствия данных. Проверяет, совпадает ли среднее из 5 столбцов с первым столбцом? Может ли быть проблемой, если среднее значение будет таким же, как и первое? Я предполагаю не потому, что это приведет к множеству ложных срабатываний, но я не понимаю, как работает эта формула. Я также хочу, чтобы он был ИСТИННЫМ, если в строке нет NA, поэтому я думаю, что мне нужно что-то написать. – Bofstein

+0

Он проверяет, все ли значения в строках указанных столбцов равны соответствующим значениям в указанном столбце (если они тогда равны среднему набору значений ИСТИНА, т.е. $ 1 $ s, в этой строке и этой средней равно 1, если они все TRUE). Он работает со строковыми переменными, если они являются * не * факторами. Если в строке есть NA, она дает NA вместо TRUE или FALSE. – Henry

0

Генри опубликовал короткое и быстрое рабочее решение, которое уже принято. Я все еще хотел бы добавить эту альтернативу, которая, по моему мнению, имеет небольшое преимущество в читаемости:

mydf <- data.frame(Item1 = c(5,1,2,5,5), 
        Item2 = c(5,3,2,4,2), 
        Item3 = c(5,3,2,5,3), 
        Item4 = c(5,3,2,5,5), 
        Item5 = c(5,3,2,5,5)) 

mydf$AllSame <- apply(mydf, 1, function(row) all(row==row[1])) 

ВЦСПС() функции, используемые здесь имеет na.rm аргумент, который может быть легко установлен в TRUE, если вы хотите NA следует пренебречь.

 Смежные вопросы

  • Нет связанных вопросов^_^