Преобразование из широкого в длинный формат путем сопоставления суффиксов столбцов в dplyr - PullRequest
0 голосов
/ 27 февраля 2019

Допустим, у меня есть следующие данные:

dat <- read.table(text="pairing feelings_pre feelings_post ingroup_pre ingroup_post
0 22.0 22.6 66.3 67.5
1 22.0 28.5 63.2 64.6", header=T)

Я пытаюсь преобразовать эти данные из широкоформатного формата в длинный, чтобы я мог построить предварительные и последующие результаты в виде линейного графика в ggplot.Поэтому мне нужен столбец «pre», который устанавливается в 1, если интересующий столбец имеет суффикс «_pre», и в 0, если столбец имеет суффикс «_post».

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

dat <- read.table(text="pairing variable value pre
0 feelings_pre 22.0 1
0 feelings_post 22.6 0
0 ingroup_pre 66.3 1
0 ingrop_post 67.5 0", header=T)

Я пытался использовать spread и separate с сопоставителем регулярных выражений, но не смогзаставить его работать.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Может быть немного другая возможность:

dat %>%
 gather(variable, value, -pairing) %>%
 mutate(pre = ifelse(sub(".*_", "", variable) == "pre", 1, 0)) 

  pairing      variable value pre
1       0  feelings_pre  22.0   1
2       1  feelings_pre  22.0   1
3       0 feelings_post  22.6   0
4       1 feelings_post  28.5   0
5       0   ingroup_pre  66.3   1
6       1   ingroup_pre  63.2   1
7       0  ingroup_post  67.5   0
8       1  ingroup_post  64.6   0

В этом случае он преобразует данные из широких в длинные и затем проверяет, равна ли часть после _ в ключе (то есть "переменная") "до».Если это так, он присваивает 1, в противном случае 0.

Или используя str_detect() из stringr:

dat %>%
 gather(variable, value, -pairing) %>%
 mutate(pre = str_detect(variable, "_pre") * 1)
0 голосов
/ 27 февраля 2019

Попробуйте:

library(dplyr)

dat %>% filter(pairing == 0) %>%
  gather(variable, value, -pairing) %>%
  mutate(pre = +(grepl("_pre", variable)))

Вывод:

  pairing      variable value pre
1       0  feelings_pre  22.0   1
2       0 feelings_post  22.6   0
3       0   ingroup_pre  66.3   1
4       0  ingroup_post  67.5   0

Обратите внимание, что это, если вы хотите отфильтровать 0 pairing (так как у вас его нет вваш пример).

Однако, так как вы сказали, что это частичное, вы просто оставили бы часть filter и получили бы также результаты для pairing, где она равна 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...