【问题标题】:Function to select sequential data by row in a dataset在数据集中按行选择顺序数据的函数
【发布时间】:2020-07-23 11:48:43
【问题描述】:

我正在尝试将其用作学习练习。我有一个 343345 行的数据集,需要在 ArcGIS 中对数据进行地理编码,但是完整的数据集太大而无法正常运行。我需要将数据分成 50,000 行的块,最后一个块要小一些。

目前,我正在手动执行此操作,以 50,000 个为单位,如图所示

gen_gis_test_1_50 = gen_gis[c(1:50000),]
gen_gis_test_51_100 = gen_gis[c(50001:100000),]

然后我为我创建的每个新变量使用write.csv()

我已经完成了许多这样的死记硬背的练习,并想看看编写函数的最佳方法是什么。理想情况下,该函数将读取主文件,然后每 50,000 行输出一个新变量。然后我想编写第二个函数,遍历每个函数并将其写为 csv。

提前非常感谢!

【问题讨论】:

标签: r


【解决方案1】:

如果您对使用 tidyverse 感到满意,那么有一些简洁的功能可以以一种简短而简单的方式完成这些工作。您首先创建一个分组变量(只需将行号除以 50000 并取模)。接下来,您使用 dplyrs group_by 函数对数据集进行分组,然后再使用 group_map 函数(同样来自 dplyr 包)将数据写入 csv 文件。

使用 Darren Tsais 示例(虹膜数据集每个拆分为 40 行),如下所示:

library(dplyr)

iris %>%
  mutate(grp = (row_number() - 1) %/% 40) %>% #create the modulo of the rownumber divided by 40
  group_by(grp) %>%
  group_map(~write.csv(.x, file = paste0("dataset_split_", .y, ".csv")))

group_map 函数中,~ 用于定义将应用于每组数据帧的函数。 .x 代表(拆分)数据集(现在最多 40 行长),.y 代表分组值(在本例中为 0-3),因此每个组都有不同的文件名。生成的文件将命名为 dataset_split_0.csvdataset_split_1.csvdataset_split_2.csvdataset_split_3.csv。在您的情况下,只需将iris 替换为gen_gis 并将40 替换为50000,它应该可以工作。

【讨论】:

  • 谢谢,所以尝试了您的示例,但我收到错误“group_by(grp) 中的错误:找不到对象'grp'”。我也用我的特定值替换了 iris 和 40 。在我运行“group_by(grp)...”代码后出现错误
  • 使用mutate(grp = (row_number() - 1) %/% 40)更贴心。您可以查看table((1:150) %/% 40)table((1:150 - 1) %/% 40) 之间的区别。
  • @DeebaYavrom 哦,对了,我忘了%>%group_by 之后,这是必需的,以便整个代码块作为一个函数链执行。
【解决方案2】:

以内置数据集iris 为例,它有 150 行。现在我想将数据分成 40 行的块。我们知道150 / 40 = 3...30,所以最后一个块将是iris[121:150, ]。然后进行以下计算:

df <- iris
n <- 40
grp <- (1:nrow(df)-1) %/% n

table(grp)
#  1  2  3  4 
# 40 40 40 30 

您可以获得 4 个组。除最后一行外,每组有 40 行。最后用split()分割数据,Map()分别导出。

df_split <- split(df, grp)
Map(function(x, y){
  write.csv(x, sprintf("gen_gis_%d_%d.csv", y, y + nrow(x) - 1), row.names = F)
}, df_split, (seq_along(df_split)-1) * n + 1)

检查您的工作目录:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2011-07-18
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多