Разбейте фреймы данных на более мелкие и сохраните их - PullRequest
0 голосов
/ 19 ноября 2018

Нужна помощь, чтобы динамически разбить один кадр данных на несколько меньших, основываясь на интервале столбцов, и сохранить также их.Пример:

x = data.frame(num = 1:26, let = letters, LET = LETTERS)

Приведенный выше кадр данных x необходимо разбить на меньшие кадры данных на основе значения в num в интервале 5 ,Результатом будет 6 информационных кадров

> 1.    0 – 5
> 2.    6 – 10
> 3.    11 – 15
> 4.    16 -20
> 5.    21 -25
> 6.    26 – 30

Спасибо, Викрам

Ответы [ 4 ]

0 голосов
/ 19 ноября 2018

Это, кажется, аккуратнее. Вы можете легко настроить имена выходных файлов и количество разделений

library(tidyverse)

df <- data.frame(num = 1:26, let = letters, LET = LETTERS)

# split data frame into 6 pieces
split_df <- split(df, ceiling(1:nrow(df) / nrow(df) * 6))

# save each of them in turn
split_df %>%
 names(.) %>%
 walk(~ write_csv(split_df[[.]], paste0("part_", ., ".csv")))
0 голосов
/ 19 ноября 2018

Использование Tidyverse

library(tidyverse)

x = data.frame(num = 1:26, let = letters, LET = LETTERS)


##Brake the data frame
y <- x %>%
  mutate(group = cut_width(num,5, boundary = 0,closed = "right"))

##Put them into a list
list_1 <- lapply(1:length(unique(y$group)),
                function(i)filter(y, group == unique(y$group)[i]))
0 голосов
/ 19 ноября 2018

Рассмотрим также тегирование записей кратными 5, затем выполнение by, функция разделения кадра данных на один или несколько факторов:

df <- data.frame(num = 1:26, let = letters, LET = LETTERS)

df$grp <- ceiling(df$num / 5)

df_list <- by(df, df$grp, function(sub) transform(sub, grp=NULL))

выход

df_list

# df$grp: 1
#   num let LET
# 1   1   a   A
# 2   2   b   B
# 3   3   c   C
# 4   4   d   D
# 5   5   e   E
# ------------------------------------------------------------------------------------------- 
# df$grp: 2
#    num let LET
# 6    6   f   F
# 7    7   g   G
# 8    8   h   H
# 9    9   i   I
# 10  10   j   J
# ------------------------------------------------------------------------------------------- 
# df$grp: 3
#    num let LET
# 11  11   k   K
# 12  12   l   L
# 13  13   m   M
# 14  14   n   N
# 15  15   o   O
# ------------------------------------------------------------------------------------------- 
# df$grp: 4
#    num let LET
# 16  16   p   P
# 17  17   q   Q
# 18  18   r   R
# 19  19   s   S
# 20  20   t   T
# ------------------------------------------------------------------------------------------- 
# df$grp: 5
#    num let LET
# 21  21   u   U
# 22  22   v   V
# 23  23   w   W
# 24  24   x   X
# 25  25   y   Y
# ------------------------------------------------------------------------------------------- 
# df$grp: 6
#    num let LET
# 26  26   z   Z
0 голосов
/ 19 ноября 2018

Вы можете использовать функцию split и функцию cut для выполнения операции:

x = data.frame(num = 1:26, let = letters, LET = LETTERS)

answer<-split(x, cut(x$num, breaks=c(0, 5, 10, 15, 20, 25, 30)))

затем вы можете передать этот список на lapply для дальнейшей обработки.

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