R:将大字符行分成多个部分

时间:2019-07-30 14:56:26

标签: r split character

对于包含99150000行的大型数据帧,以下代码将数据my_df分成1000行的块并写入磁盘。

lapply(seq(1, nrow(my_df), by = 1000),
       function(i) write.table(my_df[i:i+1000-1,]
                               , file = paste0('path_to_logal_dir/data'
                                               , i, '-', i+1000-1, '.csv')
                               ,row.names = F,col.names = F,quote = F)
)

现在,我具有相同的字符格式数据(99150000个元素),下面是示例数据:

[1] "1979_1,532,40,7.7,12.9,116.9,12.9,85,2,2.001,4,25,55,5.3,55,85,7.7,85,145,7.5,145,265,5.0"
[2] "1979_2,532,40,7.7,12.9,116.9,12.9,85,2,2.001,4,25,55,5.3,55,85,7.7,85,145,7.5"
[3] "1979_3,532,40,7.7,12.9,116.9,12.9,85,2,2.001,4,25,55,5.3,55,85,7.7,85"
...
[99150000] ...

我如何实现上述相同的任务,即将字符格式数据拆分为大块(包含1000行的文件)?

1 个答案:

答案 0 :(得分:1)

这是仅使用基数R的解决方案。您可以使用apply family或purrr包轻松地对其进行概括。首先,我创建一些虚假数据

SELECT COUNT(1/0)

您想将字符向量分为1000行。为简单起见,我将此向量分成2行的组

fake_data <- c("A", "B", "C", "D", "E", "F", "G", "H")
fake_data
#> [1] "A" "B" "C" "D" "E" "F" "G" "H"

这意味着字符向量的前2个元素属于第一组,后2个元素属于第二组,依此类推

group_length <- 2

现在我将字符向量分为基于子组的

groups <- rep(1 : (length(fake_data) / group_length), each = group_length)
groups
#> [1] 1 1 2 2 3 3 4 4

并创建一个for循环以将每个子组保存到文件

splitted_groups <- split(fake_data, groups)
splitted_groups
#> $`1`
#> [1] "A" "B"
#> 
#> $`2`
#> [1] "C" "D"
#> 
#> $`3`
#> [1] "E" "F"
#> 
#> $`4`
#> [1] "G" "H"

reprex package(v0.3.0)于2019-07-30创建

您还可以使用purrr包中定义的映射系列替换last for循环。