Сбор данных по парным столбцам - PullRequest
0 голосов
/ 13 февраля 2019

У меня проблемы с формированием моего dataframe.Вот пример:

id  institution name1         id1   name2           id2
1   usp         Miles Davis   123   Arturo Sandoval 111
2   unb         Chet Baker    321   Clifford Brown  121
3   usp         Wayne Shorter 222   Hermeto Pascoal 322
4   Puc-rio     John Coltrane 333   Charlie Parker  112

Мне нужно сохранить столбцы id и institution и собрать другие, как это:

id  institution name_all        id_all
1   usp         Miles Davis     123
1   usp         Arturo Sandoval 111
2   unb         Chet Baker      321
2   unb         Clifford Brown  121
3   usp         Wayne Shorter   222
3   usp         Hermeto Pascoal 322
4   Puc-rio     John Coltrane   333
4   Puc-rio     Charlie Parker  112

Я использую gather функция из dplyr:

df %>%
gather(name_all, id_all, -id, -institution)

но это происходит так:

id  institution name    id
1   usp         name1   Miles Davis
1   usp         id1     123
2   unb         name1   Chet Baker
2   unb         id2     121

Есть какие-нибудь идеи о том, как соединить эти значения?У меня есть более 5 столбцов для этого, я думаю, что мне не хватает аргумента, чтобы указать, какой из них является парным.Надеюсь, я ясно дал понять.

Ответы [ 2 ]

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

Для решения tidyverse вы можете:

library(dplyr)
library(tidyr)

df %>%
  gather(ColType, ColValue, -id, -institution) %>% 
  mutate(id_number = gsub("^(\\D*)(\\d*)$", "\\2", ColType, ignore.case = TRUE, perl = TRUE),
         ColType = gsub("^(\\D*)(\\d*)$", "\\1", ColType, ignore.case = TRUE, perl = TRUE)
         ) %>% 
  spread(ColType, ColValue) %>% 
  select(-id_number)
0 голосов
/ 13 февраля 2019

Я уверен, что есть более элегантное решение, но вы можете попробовать:

df %>%
 gather(var, name_all, -matches("id|institution")) %>%
 gather(var2, val, -c(id, institution, var, name_all)) %>%
 mutate(id_all = ifelse(parse_number(var) == parse_number(var2), val, NA)) %>%
 na.omit() %>%
 select(-var, -var2, -val) %>%
 arrange(id)

  id institution        name_all id_all
1  1         usp     Miles_Davis    123
2  1         usp Arturo_Sandoval    111
3  2         unb      Chet_Baker    321
4  2         unb  Clifford_Brown    121
5  3         usp   Wayne_Shorter    222
6  3         usp Hermeto_Pascoal    322
7  4     Puc-rio   John_Coltrane    333
8  4     Puc-rio  Charlie_Parker    112

Во-первых, оно преобразует данные из широких в длинные, исключая переменные, которые называются институция или идентификатор.Во-вторых, он выполняет второе преобразование ширины в длину, чтобы все пронумерованные переменные "id" и их значения были представлены в виде отдельных строк.В-третьих, он проверяет, имеет ли переменная «name» число в качестве переменной «id». Если это так, он присваивает соответствующее значение, в противном случае - NA. Наконец, он удаляет строки с NA, избыточными переменными и упорядочивает данные.

Пример данных:

df <- read.table(text = "
                 id  institution name1         id1   name2           id2
                 1   usp         Miles_Davis   123   Arturo_Sandoval 111
                 2   unb         Chet_Baker    321   Clifford_Brown  121
                 3   usp         Wayne_Shorter 222   Hermeto_Pascoal 322
                 4   Puc-rio     John_Coltrane 333   Charlie_Parker  112", header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...