将一个数据帧分成许多名称在 R 中

Dividing one dataframe into many with names in R

我有一些大数据框,大到足以在我的机器上突破 R 的极限;例如,我目前正在处理的是 2 列乘以 7000 万行。内容并不重要,但以防万一,第 1 列是字符串,第 2 列是整数。

我想做的是将该数据框分成 n 个部分(比如 20 个,但最好是可以根据具体情况进行更改的部分),以便我可以处理每个较小的数据一次画一个框。这意味着 (a) 结果必须产生命名的东西(例如,“newdf_1”、“newdf_2”、...“newdf_20”或其他东西),以及(b) 原始数据框中的每一行都需要在一个(并且只有一个)新的“子”数据框中。顺序无关紧要,但按行顺序进行对我来说很有意义。

完成工作后,我将开始重新组合它们(使用 rbind())一次一对。

我看过 split(),但据我所知,它是设计用于处理因素(我没有)。

有什么想法吗?

这是一个基于 tidyverse 的解决方案。尝试使用 read_csv_chunked().

# practice data
tibble(string = sample(letters, 1e6, replace = TRUE),
               value = rnorm(1e6) %>% 
write_csv("test.csv")

# here's the solution
partial_data <- read_csv_chunked("test.csv", 
              DataFrameCallback$new(function(x, pos) filter(x, string == "a")),
              chunk_size = 1000)

您可以将对 read_csv_chunked 的调用包装在一个函数中,您可以在该函数中更改子集所在的字符串。

这或多或少是对这个问题的重复: How to read only lines that fulfil a condition from a csv into R?

您可以创建一个新列并根据该列拆分数据框。该列不需要是因子,但需要是可以通过split函数转换为因子的数据类型。

# Number of groups
N <- 20

dat$group <- 1:nrow(dat) %% N

# Add 1 to group
dat$group <- dat$group + 1

# Split the dat by group
dat_list <- split(dat, f = ~group)

# Set the name of the list
names(dat_list) <- paste0("newdf_", 1:N)

数据

set.seed(123)

# Create example data frame
dat <- data.frame(
  A = sample(letters, size = 70000000, replace = TRUE),
  B = rpois(70000000, lambda = 1)
)