2015-06-22 1 views
4

У меня есть два кадра данных. Один из них - 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 
+0

Вы говорите, что хотите интерполяцию, но 'createDataPartition' производит только случайные выборки. – Zelazny7

+0

Я не был уверен, что будет работать усреднение или интерполяция. Я отредактировал свой оригинальный пост, потому что получается, что ни один из них не будет работать для моего набора данных из-за физики того, что я измеряю. Вы правы, мне нужна выборка, поэтому createDataPartition - это сложный, но функциональный вариант прямо сейчас. – SatelliteEyes

ответ

1

Предлагаю вам начать бутстрап. http://www.ats.ucla.edu/stat/r/library/bootstrap.htm

Повторная выборка - это ваше решение, чтобы получить репрезентативную выборку вашего большого набора данных!

0

Возможно, у вас будет пакет sinecol и функция approxTime? Это может быть слишком ограничительным для вашего набора данных, и вам нужно будет разработать свои интерполяции для вектора xout.

Смежные вопросы