【问题标题】:How can I split large dataset iteratively to get smaller datasets by rows如何迭代拆分大型数据集以按行获取较小的数据集
【发布时间】:2020-12-04 01:04:52
【问题描述】:

我有一个数据集,其中有一列的天数从 1 到 182 天。我想将此数据集拆分为较小的 30 天数据框。但是,我希望数据框形成如下:

数据框 1:第 1 天 - 第 30 天(第 1-30 行)
数据框 2:第 2 天 - 第 31 天(第 2-31 行)
数据框 3:第 3 天 - 第 33 天(第 3-32 行)等等。

我已经知道如何分割 30 天,但找不到这样的分割方法!请让我知道如何使用 R 中的某些功能来做到这一点

【问题讨论】:

  • 使用embed 创建一个包含所需行索引的矩阵,并在该矩阵上使用apply 提取相关行。
  • 所以你想要 152 个数据框作为你的答案?
  • @G5W 是的!我想继续制作数据框,直到我到达最后一天,也就是第 182 天。
  • @A5C1D2H2I1M1N2O1R2T1你能写一个例子吗?我只是查看了嵌入文档,但不明白如何指定 30 天的期限。
  • @Sanam,我已经详细说明了我的评论作为答案。

标签: r function dataframe


【解决方案1】:

这是我对你所要求的内容的看法。

dat <- data.frame(jday = 1:182,
                  value = rnorm(182, 10, 1))

# window interval
windx <- 30

# iterate up until you run out of rows
res <- lapply(1:(nrow(dat) - windx), function(i) {
  dat[i:(i + (windx-1)),]
})

# 152 data.frames
length(res)
#> [1] 152

# 30 rows
nrow(res[[1]])
#> [1] 30

# look at first 6 values from first 6 data.frames
lapply(head(res), head)
#> [[1]]
#>   jday     value
#> 1    1 13.062751
#> 2    2  9.468940
#> 3    3  9.371270
#> 4    4 11.477544
#> 5    5 11.072019
#> 6    6  9.598129
#> 
#> [[2]]
#>   jday     value
#> 2    2  9.468940
#> 3    3  9.371270
#> 4    4 11.477544
#> 5    5 11.072019
#> 6    6  9.598129
#> 7    7  9.349836
#> 
#> [[3]]
#>   jday     value
#> 3    3  9.371270
#> 4    4 11.477544
#> 5    5 11.072019
#> 6    6  9.598129
#> 7    7  9.349836
#> 8    8 10.149530
#> 
#> [[4]]
#>   jday     value
#> 4    4 11.477544
#> 5    5 11.072019
#> 6    6  9.598129
#> 7    7  9.349836
#> 8    8 10.149530
#> 9    9  9.521323
#> 
#> [[5]]
#>    jday     value
#> 5     5 11.072019
#> 6     6  9.598129
#> 7     7  9.349836
#> 8     8 10.149530
#> 9     9  9.521323
#> 10   10  9.726165
#> 
#> [[6]]
#>    jday     value
#> 6     6  9.598129
#> 7     7  9.349836
#> 8     8 10.149530
#> 9     9  9.521323
#> 10   10  9.726165
#> 11   11  8.876201

# all data.frames are 30 rows long
all(unlist(lapply(res, nrow) == 30))
#> [1] TRUE

reprex package (v0.3.0) 于 2020 年 12 月 3 日创建

【讨论】:

  • 感谢您的帮助!这也很有帮助。将对其进行测试。
  • 希望它对你有用!如果是这样,您可以将我的回答标记为您问题的“答案”。
【解决方案2】:

假设您有这样的data.frame

set.seed(1)
d <- data.frame(matrix(sample(20, 30, TRUE), ncol = 3))
#    X1 X2 X3
# 1   6  5 19
# 2   8  4  5
# 3  12 14 14
# 4  19  8  3
# 5   5 16  6
# 6  18 10  8
# 7  19 15  1
# 8  14 20  8
# 9  13  8 18
# 10  2 16  7

... 创建一个矩阵来标识感兴趣的行。在这里,我对每三行感兴趣,即 1-3、2-4、3-5、...、8-10。根据您的情况将“3”更改为 30。

m <- embed(1:nrow(d), 3)
m
#      [,1] [,2] [,3]
# [1,]    3    2    1
# [2,]    4    3    2
# [3,]    5    4    3
# [4,]    6    5    4
# [5,]    7    6    5
# [6,]    8    7    6
# [7,]    9    8    7
# [8,]   10    9    8

获得这些后,在索引中使用 lapply 以提取相关行。

lapply(1:nrow(m), function(x) d[rev(m[x, ]), ])
# [[1]]
#   X1 X2 X3
# 1  6  5 19
# 2  8  4  5
# 3 12 14 14
#
# [[2]]
#   X1 X2 X3
# 2  8  4  5
# 3 12 14 14
# 4 19  8  3
# 
# [[3]]
#   X1 X2 X3
# 3 12 14 14
...
...
# [[7]]
#   X1 X2 X3
# 7 19 15  1
# 8 14 20  8
# 9 13  8 18
# 
# [[8]]
#    X1 X2 X3
# 8  14 20  8
# 9  13  8 18
# 10  2 16  7

结果是您的data.frames 中的list。如果您真的想在工作区中将所有子集作为单独的 data.frames 使用,可以使用 list2env

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2020-10-09
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多