Для цикла, чтобы фильтровать по лат через каждые 5 десятичных знаков - PullRequest
1 голос
/ 31 мая 2019

Мне нужно написать цикл for, чтобы использовать функцию dplyr :: filter () для фильтрации широты каждые 5 точек, а затем усреднить черту для каждого 5-градусного бина.

Я хотел бы сделать этодля 5-градусных интервалов по латам непрерывно от -180 до 180, а затем o

Фрейм данных состоит из 2 столбцов: широта и черта

, например:

lat             trait
-0.830361   0.113935
-0.795028   0.113935
-0.729722   0.113935
-0.729722   0.113935
8.021833    0.113935
5.473333    0.113935
5.436333    0.113935
7.366667    0.113935

Мне бы хотелось, чтобы каждая черта была усреднена по корзине, а затем выведена в df.

data.df %>%
  dplyr::filter(lat >= -180 & lat <= -175, .preserve= T)

Конечным выводом будет кадр данных с одним столбцом, содержащим все корзины, а второй столбец, содержащийсредние значения

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Вот базовое решение R с cut() и aggregate()

data.df$lat_group <- cut(data.df$lat, breaks = seq(-180, 180, 5))
aggregate(trait ~ lat_group, data = data.df, FUN = mean)

  lat_group     trait
1    (-5,0] 1.3354512
2    (5,10] 0.8354512

aggregate(data.df[, c('lat', 'trait')], by = data.df['lat_group'], FUN = mean)
#or
#aggregate(data.df[, c('lat', 'trait')], by = list(lat_group = data.df$lat_group), FUN = mean)

  lat_group        lat     trait
1    (-5,0] -0.7712082 1.3354512
2    (5,10]  6.5745415 0.8354512

Данные (копирование и вставка из @Jon Spring)

data.df <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "lat             trait
  -0.830361   5
  -0.795028   0.113935
  -0.729722   0.113935
  -0.729722   0.113935
  8.021833    3
  5.473333    0.113935
  5.436333    0.113935
  7.366667    0.113935")
0 голосов
/ 01 июня 2019
data.df %>% 
  group_by(avg_lat = round(lat/5)*5) %>% 
  summarize(mean = mean(trait))

Учитывая более разнообразные примеры данных ниже, вы увидите:

# A tibble: 3 x 2
  avg_lat  mean
    <dbl> <dbl>
1       0 1.34 
2       5 0.114
3      10 3

data.df <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "lat             trait
-0.830361   5
-0.795028   0.113935
-0.729722   0.113935
-0.729722   0.113935
8.021833    3
5.473333    0.113935
5.436333    0.113935
7.366667    0.113935")
...