【问题标题】:Dividing one dataframe into many with names in R将一个数据框划分为多个 R 中的名称
【发布时间】:2022-01-16 12:28:11
【问题描述】:

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

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

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

我查看了split(),但据我所知,它旨在处理因子(我没有)。

有什么想法吗?

【问题讨论】:

标签: r dataframe data-manipulation large-data


【解决方案1】:

您可以创建一个新列并根据该列拆分数据框。该列不需要是因子,但需要是可以被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)
)

【讨论】:

  • 我可以看到这是如何工作的;不过,这似乎很乏味。
【解决方案2】:

这是一个基于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?

【讨论】:

  • 有趣 - 我从未见过read_csv_chunked。我要调查一下。
猜你喜欢
  • 2020-09-22
  • 2018-06-06
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
相关资源
最近更新 更多