Как реализовать извлечение / отделение функций (от dplyr и tidyr) для разделения столбца на несколько столбцов.на основе произвольных значений? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть столбец:

Y = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)

Я хотел бы разбить на несколько столбцов, в зависимости от положения значений столбца.Например, мне бы хотелось:

Y1=c(1,2,3,4,5)
Y2=c(6,7,8,9,10)
Y3=c(11,12,13,14,15)
Y4=c(16,17,18,19,20)

Поскольку я работаю с большим набором временных рядов данных, деления будут произвольными в зависимости от продолжительности одного периода времени.

Ответы [ 3 ]

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

Вы можете использовать базу split, чтобы разделить этот вектор на векторы, каждый из которых имеет длину 5 элементов.Вы также можете использовать переменную для хранения этой длины интервала.

Используя rep с each = 5 и программным путем создавая последовательность, вы получаете последовательность чисел 1, 2, ... додлина делится на 5 (в данном случае 4), каждый раз 5 раз подряд.Затем split возвращает список векторов.

Стоит отметить, что различные посты SO будут рекомендовать вам хранить подобные данные в списках, подобных этому, а не создавать несколько переменных, поэтому я оставляю их здесь в виде списка.

Y <- 1:20

breaks <- rep(1:(length(Y) / 5), each = 5)
split(Y, breaks)
#> $`1`
#> [1] 1 2 3 4 5
#> 
#> $`2`
#> [1]  6  7  8  9 10
#> 
#> $`3`
#> [1] 11 12 13 14 15
#> 
#> $`4`
#> [1] 16 17 18 19 20

Создано в 2019-02-12 пакетом Представление (v0.2.1)

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

Мы можем использовать split (запись закомментированного кода в качестве решения) для split vector в list из vector с.

lst <- split(Y, as.integer(gl(length(Y), 5, length(Y))))
lst
#$`1`
#[1] 1 2 3 4 5

#$`2`
#[1]  6  7  8  9 10

#$`3`
#[1] 11 12 13 14 15

#$`4`
#[1] 16 17 18 19 20

Здесь gl создают индекс группировки, указав параметры n, k и length, где n - целое число, указывающее количество уровней, k- целое число, указывающее количество повторений, и length - целое число, указывающее длину результата.

В нашем случае мы хотим, чтобы k было равно 5.

as.integer(gl(length(Y), 5, length(Y)))
#[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

Если мы хотим иметь несколько объектов в глобальной среде, используйте list2env

list2env(setNames(lst, paste0("Y", seq_along(lst))), envir = .GlobalEnv)
Y1
#[1] 1 2 3 4 5
Y2
#[1]  6  7  8  9 10
Y3
#[1] 11 12 13 14 15
Y4
#[1] 16 17 18 19 20

Или в качестве OP, упомянутого в вопросе dplyr/tidyr, мы можем использовать эти пакетыа также

library(tidyverse)
tibble(Y) %>%
   group_by(grp = (row_number()-1) %/% 5 + 1) %>% 
   summarise(Y = list(Y)) %>%
   pull(Y)
#[[1]]
#[1] 1 2 3 4 5

#[[2]]
#[1]  6  7  8  9 10

#[[3]]
#[1] 11 12 13 14 15

#[[4]]
#[1] 16 17 18 19 20

data

Y <- 1:20
0 голосов
/ 12 февраля 2019

Не решение dplyr, но я считаю, что самый простой способ - использовать матрицы.

foo = function(data, sep.in=5) {
data.matrix = matrix(data,ncol=5)
data.df = as.data.frame(data.matrix)
return(data.df)
}

Я не тестировал его, но эта функция должна создать data.frame, который можно объединить с существующим.используя cbind()

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