преобразовать матрицу флажков в список имен столбцов - PullRequest
1 голос
/ 01 октября 2019

начинающий программист R здесь! Я работаю над некоторыми проектами для работы, и я пытаюсь ознакомиться с функциями R. Background в Python и C, и много полагаюсь на циклы for и while. Теперь с R я заметил, что мне следует избегать этого, поэтому я прошу некоторые указатели, чтобы помочь с конкретными проблемами.

Сейчас у меня есть data.table, который выглядит так:

    +-------+------------+--------------+-----------+-----------+--------------+-----------+
    | names |  Q1 - mike | Q1 - rebecca | Q1 - anna | Q2 - mike | Q2 - rebecca | Q2 - anna |
    +-------+------------+--------------+-----------+-----------+--------------+-----------+
    | linda |            |    x         |    x      |    x      |              |           |
    | john  |  x         |              |    x      |           |              |   x       |
    | anna  |  x         |    x         |           |    x      |              |           |
    +-------+------------+--------------+-----------+-----------+--------------+-----------+

Представление людей, которые ответили на имена своих друзей в качестве ответа на вопрос (например, «этот человек ваш друг?», «Вы видели его на прошлой неделе?»). Мне нужно изменить форму этой таблицы на список краев, например так:

    +-------+-----------+---------+
    | names |  question | answer  |
    +-------+-----------+---------+
    | linda |  Q1       | rebecca |
    | linda |  Q1       | anna    |
    | john  |  Q1       | mike    |
    | john  |  Q1       | anna    |
    | anna  |  Q1       | mike    |
    | anna  |  Q1       | rebecca |
    | linda |  Q2       | mike    |
    | john  |  Q2       | anna    |
    | anna  |  Q2       | mike    |
    +-------+-----------+---------+

Я видел функцию reshape, и сейчас я изучаю ее. Мне интересно, есть ли другие функции, которые могут помочь здесь? Или какова правильная терминология для описания этих типов матриц (чтобы я мог гуглить в будущем)?

Заранее спасибо !!

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Опция с использованием data.table::melt:

melt(DT, id.vars="names")[value=="x"][, 
    c("qn","ans") := tstrsplit(variable, split=" - ")][]

выход:

   names     variable value qn     ans
1:  john    Q1 - mike     x Q1    mike
2:  anna    Q1 - mike     x Q1    mike
3: linda Q1 - rebecca     x Q1 rebecca
4:  anna Q1 - rebecca     x Q1 rebecca
5: linda    Q1 - anna     x Q1    anna
6:  john    Q1 - anna     x Q1    anna
7: linda    Q2 - mike     x Q2    mike
8:  anna    Q2 - mike     x Q2    mike
9:  john    Q2 - anna     x Q2    anna

данные:

library(data.table)
DT <- fread("names |  Q1 - mike | Q1 - rebecca | Q1 - anna | Q2 - mike | Q2 - rebecca | Q2 - anna |
linda |            |    x         |    x      |    x      |              |           |
john  |  x         |              |    x      |           |              |   x       |
anna  |  x         |    x         |           |    x      |              |           |", colClasses="character")
1 голос
/ 01 октября 2019

С tidyr и dplyr с использованием данных @ chinsoon12

library(dplyr)
library(tidyr)

DT %>%
  pivot_longer(cols = -names) %>%
  #gather(name, value, -names) %>% #In older version of tidyr
  filter(value != "") %>%
  separate(name, c("question", "answer"), sep = " - ") %>%
  select(-value)

#  names question answer 
#  <chr> <chr>    <chr>  
#1 linda Q1       rebecca
#2 linda Q1       anna   
#3 linda Q2       mike   
#4 john  Q1       mike   
#5 john  Q1       anna   
#6 john  Q2       anna   
#7 anna  Q1       mike   
#8 anna  Q1       rebecca
#9 anna  Q2       mike   

Также небольшим отклонением от приведенного выше будет:

DT %>%
  na_if("") %>%
  pivot_longer(cols = -names, values_drop_na = TRUE) %>%
  separate(name, c("question", "answer"), sep = " - ") %>%
  select(-value)
...