Хобрук: Ваш путь к мастерству в программировании

Подведение итогов матрицы. Получение средних значений для каждого класса 100000 единиц

У меня есть следующая структура данных.

pos <- c(4532568,4541529,4586529,4591235,4712360,4732504,4740231,10532655,10542365,10564587,45312567,45326354,45369874,124832658,124845829,124869874)
cm <- c(2.21,2.25,2.26,2.29,3.31,3.35,3.36,4.32,4.35,4.39,5.23,5.27,5.29,7.36,7.45,7.49)
data <- cbind(pos,cm)

            pos   cm
 [1,]   4532568 2.21
 [2,]   4541529 2.25
 [3,]   4586529 2.26
 [4,]   4591235 2.29
 [5,]   4712360 3.31
 [6,]   4732504 3.35
 [7,]   4740231 3.36
 [8,]  10532655 4.32
 [9,]  10542365 4.35
 [10,]  10564587 4.39
 [11,]  45312567 5.23
 [12,]  45326354 5.27
 [13,]  45369874 5.29
 [14,] 124832658 7.36
 [15,] 124845829 7.45
 [16,] 124869874 7.49

Мое намерение состоит в том, чтобы обобщить группировку строк по 100000 единиц в столбце «pos» и получить среднее значение столбца «CM» для каждого класса. Результат в этом примере будет примерно следующим:

pos <- c(4500000,4700000,10500000,45300000,124800000)
cm <- c(2.2525,3.34,4.35333,5.26333,7.43333)
newdata <- cbind(pos,cm)

           pos      cm
[1,]   4500000 2.25250
[2,]   4700000 3.34000
[3,]  10500000 4.35333
[4,]  45300000 5.26333
[5,] 124800000 7.43333

Я не знаю, как автоматизировать процесс обработки огромного фрейма данных.

Ответ Акруну: Итак. Если я использую следующий скрипт в своем реальном наборе данных:

 Ch1<- ch1 %>%
 as.data.frame %>% 
 group_by(Pos = plyr::round_any(Pos, 1e5, f = floor))

Затем я получаю следующий результат (только первые 10 строк)

 structure(list(Chr = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L), .Label = "1", class = "factor"), Pos = c(0, 0, 0, 
 2e+05, 5e+05, 5e+05, 5e+05, 5e+05, 5e+05, 7e+05), CM = c(0, 0.080572, 
 0.092229, 0.439456, 1.478148, 1.478214, 1.480558, 1.488889, 1.489481, 
 1.931794)), .Names = c("Chr", "Pos", "CM"), row.names = c(NA, 
 -10L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = "Pos", drop = TRUE, indices = list(
 0:2, 3L, 4:8, 9L), group_sizes = c(3L, 1L, 5L, 1L), biggest_group_size = 5L, labels = structure(list(
 Pos = c(0, 2e+05, 5e+05, 7e+05)), row.names = c(NA, -4L), class = "data.frame", vars = "Pos", drop = TRUE, .Names = "Pos"))

Однако, если я использую весь скрипт для получения средних значений Ch1$CM:

 Ch1<- ch1 %>%
 as.data.frame %>% 
 group_by(Pos = plyr::round_any(Pos, 1e5, f = floor)) %>% 
 summarise(cm = mean(cm))

Затем я получаю следующий data.frame:

 structure(list(Pos = c(0, 2e+05, 5e+05, 7e+05, 8e+05, 9e+05, 
 1e+06, 1100000, 1200000, 1300000), cm = c(4.528498, 4.528498, 
 4.528498, 4.528498, 4.528498, 4.528498, 4.528498, 4.528498, 4.528498, 
 4.528498)), .Names = c("Pos", "cm"), row.names = c(NA, -10L), class = c("tbl_df", 
 "tbl", "data.frame"))

Как видите, средние значения неверны, так как все они равны. Я не знаю, почему это происходит.

26.12.2017

  • Большое спасибо, пользователь 20650. Это работает отлично. Однако мне также нужно было бы получить переменную pos, как в newdata. 26.12.2017
  • просто умножьте его на 1e5 т.е. aggregate(dat[, "cm"], list(pos=1e5* floor(dat[,"pos"]/1e5)), mean) . для больших данных data.table может быть быстрее, т.е. setDT(as.data.frame(dat))[, lapply(.SD, mean), by=1e5* floor(pos/1e5)] . Эти подходы используются так же, как хороший ответ akrun - он просто показывает, как создавать группы, возможно, немного более явно. 26.12.2017

Ответы:


1

Мы можем использовать round_any

library(dplyr)
data %>%
    as.data.frame %>% 
    group_by(grp = plyr::round_any(pos, 1e5, f = floor)) %>% 
    summarise(cm = mean(cm))
# A tibble: 5 x 2
#        grp       cm
#      <dbl>    <dbl>
#1   4500000 2.252500
#2   4700000 3.340000
#3  10500000 4.353333
#4  45300000 5.263333
#5 124800000 7.433333
26.12.2017
  • Прости, акрам! Но я не могу получить правильный результат в своем реальном наборе данных. Я отвечу на свой вопрос результатами, которые получу, когда применю ваш сценарий... Надеюсь, вы поможете мне в дальнейшем. 26.12.2017
  • @Cisco Возможно, у вас есть NA, тогда используйте mean(cm, na.rm = TRUE) или, если значения действительно большие, вам может потребоваться использовать специализированные пакеты, такие как Rmpfr или gmp, чтобы получить точность 26.12.2017
  • Как вы можете видеть ниже, первая часть скрипта работает хорошо, проблема заключается в среднем значении переменной CM по группам. 26.12.2017
  • У меня нет НС. Набор данных составляет 280000 строк. Я считаю, что это не слишком большой. 26.12.2017
  • Таким образом, group_by() работает отлично, но не summarise(). 26.12.2017
  • @Cisco Может быть, попробуйте с %>% dplyr::summarise(cm = mean(cm)) Возможно, вы также загрузили plyr, а summarise из этой библиотеки замаскировали функцию 26.12.2017
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.