Биннинг нескольких файлов с неравными интервалами в R - PullRequest
2 голосов
/ 10 января 2020

У меня много файлов с неравным количеством строк.

Данные выглядят так для одного файла:

Height Temp
1014.0 22.4
992.0 23
850.0 15.2
557.0 -6.1
407.0 -17.1
314.0 -29.5
200 -51.9

Я хочу взять среднее значение, если оно находится в пределах следующие интервалы.

1000-925
925-850
850-700
700-600
600-500
500-400
400-300
300-200
200-100
100-0

Я должен сделать это для нескольких файлов с разными значениями высоты.

Какие-либо предложения о том, как сделать это в R правильно? Я буду признателен за любую помощь.

Ответы [ 3 ]

1 голос
/ 10 января 2020

Один из вариантов здесь будет использовать sqldf, с объединением таблиц календаря и подходом агрегации:

library(sqldf)
sql <- "SELECT c.min_temp, c.max_temp, AVG(t.Temp) AS temp_avg
        FROM temps c
        LEFT JOIN df t ON t.Temp > c.min_temp AND t.Temp <= c.max_temp
        GROUP BY c.min_temp, c.max_temp"
result <- sqldf(sql)

Данные:

# this data frame stores the temperature ranges for the averages
temps <- data.frame(min_temp=c(0, 100, 200, 300, 400, 500, 600, 700, 850, 925),
                    max_temp=c(100, 200, 300, 400, 500, 600, 700, 850, 925, 1000))
1 голос
/ 10 января 2020

Альтернатива в базе R, использующая findInterval для создания групп и aggregate для получения mean по группам.

df$group <- findInterval(df$Height, c(seq(0, 700, 100), 850, 925, 1000))
aggregate(Height~group, df, mean)
1 голос
/ 10 января 2020

Вы можете сгруппировать свои высоты с cut, а затем суммировать по группам:

library(dplyr)

mutate(df, category = cut(Height, c(seq(0, 700, 100), 850, 925, 1000, Inf))) %>%
  group_by(category) %>%
  summarise(average_height = mean(Height, na.rm = TRUE))

# A tibble: 7 x 2
  category    average_height
  <fct>                <dbl>
1 (100,200]              200
2 (300,400]              314
3 (400,500]              407
4 (500,600]              557
5 (700,850]              850
6 (925,1e+03]            992
7 (1e+03,Inf]           1014
...