2013-04-15 5 views
3

Я работаю с большим набором ответов на опросы и пытаюсь выполнить поиск (чтобы получить заголовки вопросов в моей файловой системе), используя значения, хранящиеся в списке. Я боюсь, что я пропущу что-то простое с индексированием, но я просто не могу этого сделать. Вот воспроизводимый пример:Использование списка R для поиска

survey.data <- data.frame(
    question.number = c("q2","q3","q4","q5") 
) 

titles <- list(q1="question1", 
      q2="question2", 
      q3="question3", 
      q4="question4", 
      q5="question5") 

После недолгих манипуляций с данными, которые включают в себя удаление некоторых вопросов, я пытаюсь создать новую переменную question.title в моем кадре данных, используя следующий фрагмент список индексации тянуть в правильные названия:

survey.data$question.title <- titles[survey.data$question.number] 

, который дает выход:

question.number question.title 
1 q2 question1 
2 q3 question2 
3 q4 question3 
4 q5 question4 

Вы можете увидеть, что новая переменная не применяя поиск, просто «импорта» все значения список начинается с первого.

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

+0

+1 для совместного использования воспроизводимого примера вместе с тем, что вы пробовали, и ожидаемыми результатами. – A5C1D2H2I1M1N2O1R2T1

ответ

3

Вот одно решение, но прежде, чем разделить его, я изменил ваш данные немного, добавив повторный вопрос («q2»):

survey.data <- data.frame(
    question.number = c("q2","q3","q4","q5", "q2") 
) 

titles <- list(q1="question1", 
       q2="question2", 
       q3="question3", 
       q4="question4", 
       q5="question5") 

раствор использует match и unlist.

survey.data$question.title <- unlist(titles[match(survey.data$question.number, 
                names(titles))]) 
survey.data 
# question.number question.title 
# 1    q2  question2 
# 2    q3  question3 
# 3    q4  question4 
# 4    q5  question5 
# 5    q2  question2 

Как это отличается от двух решений, уже присутствующих на момент написания этого сообщения?

Два основных способа:

  1. Ни одно из этих решений будет вмещать дублированный "q2" вопрос.

    > survey.data$question.title <- titles[names(titles) %in% survey.data$question.number] 
    Error in `$<-.data.frame`(`*tmp*`, "question.title", value = list(q2 = "question2", : 
        replacement has 4 rows, data has 5 
    > survey.data$question.title <- titles[levels(survey.data$question.number)] 
    Error in `$<-.data.frame`(`*tmp*`, "question.title", value = list(q2 = "question2", : 
        replacement has 4 rows, data has 5 
    
  2. Оба других решений сохраняют list структуру для столбца «question.title» (как это решение будет также делать, если бы это было не для использования unlist), который будет проблематично, если вы пытаетесь делать такие вещи, как позже экспортировать данные в файл csv. Это особенно неприятно, потому что нет визуального указания на то, что итоговый столбец равен list, но вы можете убедиться, что просмотрев нулевую сумму str, вы получите data.frame.
+1

Отличная Ананда, спасибо.Особенно важен аспект вашего отзыва в вашем списке. –

0

Это должно работать -

survey.data$question.title <- titles[names(titles) %in% survey.data$question.number] 
0

Я думаю, что вам нужно уровни в списке, как это:

> survey.data$question.title <- titles[levels(survey.data$question.number)] 
> survey.data 
    question.number question.title 
1    q2  question2 
2    q3  question3 
3    q4  question4 
4    q5  question5 
+0

Привет, Саймон, спасибо за быстрый ответ. Это, конечно, выглядит правильно на выходе, но я вижу, что новая переменная 'question.title' представляет собой список, а не вектор символов - это то, что я получу, если захочу искать из списка? Я хотел бы иметь возможность преобразовать его в фактор или, по крайней мере, вектор символов. Но с удовольствием принимаю ваш ответ, если это насколько я могу получить. –

+0

Еще раз спасибо Саймону, но ответ Ананды охватил это, и я согласился. –