我有两个数据框,一个有大约133行,另一个有大约4337行。它们各自有两列包含相同类型的信息。第一列是太阳高度角,第二列是辐射度。我想将大型数据框的行数减少到小型数据框的行数,以便在进行分析时不会出现维度错误。我不想将它们合并成一个数据框。
问题是,我不想丢失任何数据。经进一步检查,我发现我也不能做平均值,因为这对我的数据来说没有物理意义。
我一直在尝试在dplyr或reshape2中找到可以做到这一点的东西,但迄今为止还没有成功。
注意:
示例中的维度比我的真实维度小,以简化问题。
这里提供的解决方案似乎接近:在R中计算数据框中每13行的平均值 然而,我遇到了四舍五入的问题,导致结果新数据框中行数过多或过少。
我尝试过更改n,但由于四舍五入的原因,结果要么只有约130行(太少),要么太多(如示例所示)。另一个问题是对我来说保持大致相同的sunel范围很重要,而df3中的范围是不可接受的。
这是我使用“caret”找到的hack解决方案。我会感激任何更优雅的解决方案的建议。
问题是,我不想丢失任何数据。经进一步检查,我发现我也不能做平均值,因为这对我的数据来说没有物理意义。
我一直在尝试在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