2013-04-25 5 views
0

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

myDATA<-data.frame(rbind(c("red","blue","green", "dog","hat","cat") 
        ,c("blue","green", "blue","dog","hat","cat") 
        ,c("green","blue","blue","dog","hat","cat") 
        ,c("green","red", "blue","dog","hat","cat") 
        ) 
       ) 
names(myDATA)<-c(paste("Color",1:3,sep=""),paste("Stim",1:3,sep="")) 
myDATA$greenImage<-NA 

Что дает:

MyData

+-----------------------------------------------------+ 
| Color1 Color2 Color3 Stim1 Stim2 Stim3 greenImage | 
+-----------------------------------------------------+ 
| 1 red blue green dog hat cat   NA | 
| 2 blue green blue dog hat cat   NA | 
| 3 green blue blue dog hat cat   NA | 
| 4 green red blue dog hat cat   NA | 
+-----------------------------------------------------+ 

В Color столбцы соответствуют Stim столбцов по числу, например, Stim1 отображается в Color1 и так далее. Для каждой строки один Stim отображается зеленым цветом. Я хочу найти это Stim и сохранить в новом столбце под названием greenImage.

Я собираюсь из ряда должностей, что apply() может быть полезен здесь, но я не смог заставить его работать. Мое довольно безвкусное решение было петлей ниже формы,

for (i in 1:nrow(myDATA)) { 
    x <- match("green", unlist(myDATA[i,paste("Color", 1:3, sep="")])) 
    myDATA[i,"greenImage"] <- as.character(myDATA[i, paste("Stim", x, sep="")]) 
} 

Результирующее в:

myDATA 
+-----------------------------------------------------+ 
| Color1 Color2 Color3 Stim1 Stim2 Stim3 greenImage | 
+-----------------------------------------------------+ 
| 1 red blue green dog hat cat  cat | 
| 2 blue green blue dog hat cat  hat | 
| 3 green blue blue dog hat cat  dog | 
| 4 green red blue dog hat cat  dog | 
+-----------------------------------------------------+ 

Однако фактический набор данных имеют более чем 10000 строк, так что мое решение очень неэффективно. Может ли кто-нибудь предложить альтернативный подход, который более эффективен?

Заранее благодарен!

ответ

1

Просто используйте ifelse векторизовать ваши сравнения:

for (i in 1:3) { 
    myDATA$greenImage = ifelse (myDATA[,i] == "green", 
           as.character(myDATA[,i+3]), 
           myDATA$greenImage) 
} 

Обратите внимание, что as.character требуется, чтобы получить строку из ваших factor-х гг. Вы можете избежать этого, если используете stringsAsFactors = FALSE при создании своего data.frame.

+0

Большое спасибо за быстрый ответ. Это было прямо и эффективно. Очень признателен. –

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