У меня есть два кадра данных. Один из них - 133 строки, а один - 4337 строк. Каждый из них имеет два столбца, содержащих один и тот же тип информации. Возвышение Солнца в первом столбце и Сияние во втором столбце. Я хотел бы уменьшить количество строк большого кадра данных до количества строк в малом кадре данных, чтобы я мог продолжить анализ без ошибок измерения. Я не хочу объединять их в единый фрейм данных.Уменьшить количество больших кадров данных до меньших кадров данных, когда размеры не делятся
Дело в том, что я не хочу потерять данные. При дальнейшем осмотре я понял, что я также не могу делать это, потому что это не является физически значимым для моих данных.
Я пытался найти что-то в dplyr
или reshape2
, который сделает это, но пока не повезло.
Примечания:
- Размеры в примере меньше, чем мои реальные размеры мира для простоты
Решение, представленное здесь, по-видимому, близко: Calculate the mean of every 13 rows in data frame in R
Однако, я столкнувшись с проблемами с округлением, в результате получается слишком много или слишком мало строк в результирующем новом кадре данных.
Пример кода пытается реализовать вышеупомянутое-сшитое решение:
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
Я пытался изменить п, но из-за округления, это приводит либо ~ 130 строк (слишком мало), или слишком много (как показано в примере). Другая проблема заключается в том, что для меня важно поддерживать, примерно такой же диапазон солнечных лучей и диапазон в df3 неприемлем.
Это решение для взлома, которое я нашел, используя caret
. Я был бы признателен за любые советы по более элегантному решению.
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