【问题标题】:function for dividing data frame into segments in R在R中将数据帧划分为段的函数
【发布时间】:2023-03-10 01:51:01
【问题描述】:

我正在处理一个包含时间列和风速列的大型数据集。我需要找到一种方法来根据时间列将数据帧分成更小的段。如果我的数据框是

hrmin    wind
1100     x1
1100     x2
1100     x3
1101     x4
1101     x5
1101     x6
1102     x7
1102     x8
1102     x9
1103     x10
1103     x11
1103     x12

我需要一个函数将其分成更小的段,然后输出这些段。如果我想把它分成两部分,那么我的结果是

df1
1100     x1
1100     x2
1100     x3
1101     x4
1101     x5
1101     x6

df2
1102     x7
1102     x8
1102     x9
1103     x10
1103     x11
1103     x12

如果我需要输出四个数据帧,那么我会

df1
1100     x1
1100     x2
1100     x3

df2
1101     x4
1101     x5
1101     x6

df3
1102     x7
1102     x8
1102     x9

df4
1103     x10
1103     x11
1103     x12

我想我需要一个包含 split() 和 subset() 的函数,但我不确定如何构建它。我在想一些类似的事情

function( full data frame,number of segments I need) {

split(full data frame, subset(time segments))
return(appropriate amount of smaller data frames)

}

有没有办法做到这一点,或者比制作函数更好的方法?我找到了显示较小数据帧的方法,但理想情况下我希望它们以 df1、df2、df3 之类的名称返回......所以我可以在它们输出后单独处理它们

【问题讨论】:

  • 我想出了这个split(df1, (cumsum(!duplicated(df1$hrmin))-1)%/%n+1) 如果我们指定n <-1,它将被每个唯一的hrmin 分割,变为n <- 2,由两个'hrmin' 分割,与您的输出相同。但是正如前面在 cmets 中提到的@Frank,假设如果你有 5 个唯一的 'hrmin',你想如何除以 3。在上述方法中,它首先将 3 个唯一的 hrmin 拆分为一个列表元素,并将 2 个拆分为下一个列表元素。
  • 我在示例中使用了 3 hrmin,但我的真实数据集有更多。每个组都需要由 hrmin 标识。我需要将所有 1100 和 1101 的 hrmin 分配给 df1,并将所有 1102 和 1103 的 hrmin 分配给 df2。我认为@Frank 提供了一个很好的观点,并且能够为我指明正确的方向
  • @user2113499 仅供参考,除非您正在并行化您的计算(使用您的计算机和花哨/高级工具同时在多个 data.frames 上运行计算),否则您可能不想拆分data.frame 以这种方式向上。
  • 所以数据是 20 赫兹,但我让我的时间只显示小时和分钟,我想做的是取某些时间范围的平均值。因此,在一个数据框中,我可以拥有所有 1100 和 1101 数据点,而在另一个 df 中,我有 1102 和 1103。对于每个 df,我将取平均风速。然后我会再次这样做,但使用 4 个数据帧。这是为了证明选择正确的平均时间尺度的重要性。
  • 没有必要为此设置单独的数据框。您可以为每个案例创建一个分组变量,然后使用 aggregate 或 data.table 或 dplyr 包对其进行聚合。如果您发布的内容更像您的应用程序(在单独的问题中),我敢打赌有人可以提供帮助。

标签: r subset


【解决方案1】:

这与@akrun 的回答非常相似(可能目前已删除):

library(data.table)
setDT(DT)

DT[, g := .GRP, by=hrmin]
split(DT, findInterval(
  DT$g, 
  seq(1, uniqueN(DT$hrmin), length.out = n + 1), 
  rightmost.closed = TRUE 
))

它只是根据组的数量(并忽略每个组中的行数)按顺序拆分组。您可以更改 n 以查看其工作原理。将其放入函数中很简单。没有data.table,这也不难做到;它在这里被简单地使用是因为它的快捷方式:

  • uniqueN(DT$hrmin) 是分组变量的值的数量。
  • .GRP, by=hrmin 是分组变量的 ID,计数 1..uniqueN(DT$hrmin)

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2020-12-14
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多