Заполнить столбец на основе справочной таблицы в R - PullRequest
5 голосов
/ 24 января 2020

Допустим, у меня есть следующий набор данных «ключа»:

key = read.table(text = "question r_answer d_answer
                  20 A B
                  21 B A 
                  22 A B
                  23 B A
                  24 A B
                  25 B A", header = T)

> key
  question r_answer d_answer
1       20        A        B
2       21        B        A
3       22        A        B
4       23        B        A
5       24        A        B
6       25        B        A

Это говорит мне, что для данного вопроса, какой ответ даст «R», и какой ответ даст «D» ,

Теперь предположим, что это набор данных:

data =  read.table(text = "person_id question answer
1 20 A
1 21 B
1 22 A
1 23 B
1 24 A
1 25 B
2 20 A
2 21 A
2 23 A
2 24 B
2 25 B", header = T)

>data
   person_id question answer
1          1       20      A
2          1       21      B
3          1       22      A
4          1       23      B
5          1       24      A
6          1       25      B
7          2       20      A
8          2       21      A
9          2       23      A
10         2       24      B
11         2       25      B

Это говорит мне, для данного человека, каковы были его реальные ответы. Я хочу создать в данных столбец answer_type, равный r_answer или d_answer в зависимости от значений, указанных в ключе. В результате вы получите:

   person_id question answer answer_type
1          1       20      A    r_answer
2          1       21      B    r_answer
3          1       22      A    r_answer
4          1       23      B    r_answer
5          1       24      A    r_answer
6          1       25      B    r_answer
7          2       20      A    r_answer
8          2       21      A    d_answer
9          2       23      A    d_answer
10         2       24      B    d_answer
11         2       25      B    r_answer

У меня такое ощущение, что ответом будет слияние с dplyr, но я не могу понять это.

Ответы [ 4 ]

5 голосов
/ 24 января 2020

Один dplyr и tidyr параметр может быть:

data %>%
 left_join(key %>%
            pivot_longer(-question, names_to = "answer_type"), by = c("question" = "question",
                                                                      "answer" = "value"))

   person_id question answer answer_type
1          1       20      A    r_answer
2          1       21      B    r_answer
3          1       22      A    r_answer
4          1       23      B    r_answer
5          1       24      A    r_answer
6          1       25      B    r_answer
7          2       20      A    r_answer
8          2       21      A    d_answer
9          2       23      A    d_answer
10         2       24      B    d_answer
11         2       25      B    r_answer
4 голосов
/ 24 января 2020

Мы можем сделать

library(dplyr)
library(tidyr)
data %>%
    group_split(person_id) %>%
    map_dfr(~ .x %>% 
        left_join(pivot_longer(key,  cols = -question),
              by = c('question',  'answer' = 'value')))
# A tibble: 11 x 4
#   person_id question answer name    
#       <int>    <int> <fct>  <chr>   
# 1         1       20 A      r_answer
# 2         1       21 B      r_answer
# 3         1       22 A      r_answer
# 4         1       23 B      r_answer
# 5         1       24 A      r_answer
# 6         1       25 B      r_answer
# 7         2       20 A      r_answer
# 8         2       21 A      d_answer
# 9         2       23 A      d_answer
#10         2       24 B      d_answer
#11         2       25 B      r_answer
2 голосов
/ 25 января 2020

Вот базовое решение R

data$answer_type <- apply(data, 1, function(v) {
  colnames(key)[which(key[match(v["question"],key$question),] == v["answer"])]
})

такое, что

> data
   person_id question answer answer_type
1          1       20      A    r_answer
2          1       21      B    r_answer
3          1       22      A    r_answer
4          1       23      B    r_answer
5          1       24      A    r_answer
6          1       25      B    r_answer
7          2       20      A    r_answer
8          2       21      A    d_answer
9          2       23      A    d_answer
10         2       24      B    d_answer
11         2       25      B    r_answer
2 голосов
/ 25 января 2020

Если вы хотите такой же подход с data.table. Вы можете сделать следующее. melt() работает как pivot_longer() для преобразования key в данные в длинном формате. Я создал имена столбцов таким образом, чтобы я мог легко объединить два набора данных. Затем вы сливаетесь \ присоединяетесь к data.

mykey <- melt(setDT(key), id.vars = "question", measure.vars = patterns("answer"),
              variable.name = "answer_type", value.name = "answer")

mykey[setDT(data), on = c("question", "answer")]

    question answer_type answer person_id
 1:       20    r_answer      A         1
 2:       21    r_answer      B         1
 3:       22    r_answer      A         1
 4:       23    r_answer      B         1
 5:       24    r_answer      A         1
 6:       25    r_answer      B         1
 7:       20    r_answer      A         2
 8:       21    d_answer      A         2
 9:       23    d_answer      A         2
10:       24    d_answer      B         2
11:       25    r_answer      B         2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...