Преобразование фрейма данных в длинный список ключей: значения - PullRequest
0 голосов
/ 17 октября 2018

У меня есть набор данных row data в следующем формате:

Id Avg_bed_2017 staff_2014 staff_2015 staff_2016 staff_2017 outpatient_2013
1  460265      0.00000         NA         NA         NA         NA                      NA
2  16121       13.66667        497      508.5        515        505              

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

Id category year  value 
1   Avg_bed 2017  460265
2   Avg_bed 2017  16121 
3   staff   2014  13.667
4   .....   ....  .....

Для этого я определилфункция split.col.name(col), которая использует в качестве входных данных каждое имя столбца и разбивает его на category и year и возвращает их в виде списка с двумя элементами.

Затем я разработал функцию split.col.row (rowdline), затемпринимает в качестве входных данных строку row data и возвращает строку последней таблицы.

Затем я попытался (1) запустить split.col.row (rowdline) в строках row data (257K строк) и (2) примените функцию apply() к каждой строке.(1) очень медленный, и (2) не связывает строки должным образом (создавая матрицу, ограниченную размером входных данных, в то время как в этом случае выходные данные будут иметь гораздо больше строк).Может быть, есть более эффективный способ сделать это изменение формы?

1 Ответ

0 голосов
/ 17 октября 2018

Вот решение tidyverse:

# make sample data
set.seed(1839)
dat <- data.frame(
  id = 1:3,
  avgbed_2017 = rnorm(3), # note: rename this column
  staff_2014 = rnorm(3),
  staff_2015 = rnorm(3),
  outpatient_2013 = rnorm(3)
)

# gather and separate
library(dplyr)
library(tidyr)
dat %>% 
  gather("key", "value", -id) %>% # gathers everything but id
  # if you wanna get rid of NA values, say na.rm = TRUE in gather
  separate("key", c("category", "year"), sep = "_")

Обратите внимание, что вы должны переименовать avg_bed_2017 в avgbed_2017, чтобы это работало.Если бы я лучше разбирался в регулярных выражениях, я бы сделал sep в separate регулярным выражением, которое соответствует только второму вхождению подчеркивания - возможно, кто-то другой может показать мне, как это сделать.Чтобы обойти это, я просто переименовал столбец выше, так что единственное подчеркивание - это то, на которое мы хотим разбить.


Per @ Dave2e:

set.seed(1839)
data.frame(
  id = 1:3,
  avg_bed_2017 = rnorm(3),
  staff_2014 = rnorm(3),
  staff_2015 = rnorm(3),
  outpatient_2013 = rnorm(3)
) %>%
  gather("key", "value", -id) %>% 
  separate("key", c("category", "year"), sep = "_(?=[0-9]{4})")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...