当大数据框的维度不可除时,将大数据框的行数减少到小数据框的行数

4
我有两个数据框,一个有大约133行,另一个有大约4337行。它们各自有两列包含相同类型的信息。第一列是太阳高度角,第二列是辐射度。我想将大型数据框的行数减少到小型数据框的行数,以便在进行分析时不会出现维度错误。我不想将它们合并成一个数据框。
问题是,我不想丢失任何数据。经进一步检查,我发现我也不能做平均值,因为这对我的数据来说没有物理意义。
我一直在尝试在dplyr或reshape2中找到可以做到这一点的东西,但迄今为止还没有成功。
注意:
示例中的维度比我的真实维度小,以简化问题。
这里提供的解决方案似乎接近:在R中计算数据框中每13行的平均值 然而,我遇到了四舍五入的问题,导致结果新数据框中行数过多或过少。

以下是尝试实现上述链接解决方案的代码示例:

set.seed(123)
df1 <- data.frame(sunel = sample(c(-6:4), 133, replace = TRUE),
                  rad = sample(c(1000:500000), 133, replace = TRUE))
df2 <- data.frame(sunel = sample(c(-15:15), 4337, replace = TRUE),
                  rad = sample(c(100:5000000), 4337, replace = TRUE))
df2a <- df2[df2$sunel >= -6 & df2$sunel <= 4,]

n <- (nrow(df2a) %/% 133) - 1
df3 <- aggregate(df2a, list(rep(1:(nrow(df2a) %/% n+1), each = n, len = nrow(df2a))), mean)
nrow(df1)
# [1] 133
nrow(df2a)
# [1] 1520
nrow(df3)
# [1] 150
min(df1$sunel);max(df1$sunel)
# [1] -6
# [1] 4
min(df2a$sunel);max(df2a$sunel)
# [1] -6
# [1] 4
min(df3$sunel);max(df3$sunel)
# [1] -3.2
# [1] 1.9
nrow(df3a)
# [1] 133

我尝试过更改n,但由于四舍五入的原因,结果要么只有约130行(太少),要么太多(如示例所示)。另一个问题是对我来说保持大致相同的sunel范围很重要,而df3中的范围是不可接受的。
这是我使用“caret”找到的hack解决方案。我会感激任何更优雅的解决方案的建议。
library(caret)

133/1520
# [1] 0.0875

inTrain <- createDataPartition(df2a$sunel, p = .0875, list = FALSE)
nrow(inTrain)
# [1] 135 #Nope

inTrain <- createDataPartition(df2a$sunel, p = .0874, list = FALSE)
nrow(inTrain)
# [1] 135 #Still nope

inTrain <- createDataPartition(df2a$sunel, p = .086, list = FALSE)
nrow(inTrain)
# [1] 133 #Awesome

df3a <- df2a[inTrain, ]
min(df3a$sunel);max(df3a$sunel)
# [1] -6
# [1] 4

你说你想要插值,但是createDataPartition只是随机抽样。 - Zelazny7
我不确定平均还是插值会起作用。我编辑了我的原始帖子,因为由于我所测量的物理现象,两者都无法适用于我的数据集。你说得对,我确实需要采样,因此createDataPartition现在是一个烂但有效的选择。 - SatelliteEyes
2个回答

1

0

你是否可以通过使用sinecol包和approxTime函数来解决问题?但这可能对于你的数据集过于严格,你需要自己计算xout向量的插值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接