Применение функции к различным уровням фактора в R - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть набор данных с 30 переменными и ~ 6000 строк. Переменная «номер диаграммы» идентифицирует каждого субъекта, и каждый субъект имеет повторные измерения с течением времени. Таким образом, существует ~ 500 уникальных «номеров карт», но так как эти предметы были представлены несколько раз, у нас есть ~ 6000 наблюдений.

Теперь мне нужно рассчитать данные о высоте для каждого субъекта, используя среднюю высоту посещений. Как применить функцию к каждому уровню номера диаграммы, т.е. к каждому предмету?

В данный момент я создаю список и сохраняю посещения каждого субъекта в виде отдельного фрейма данных в списке, а затем запускаю цикл для всех элементов (фреймов данных) списков.

Как применить функцию к каждому уровню номера диаграммы, не создавая список?

1 Ответ

0 голосов
/ 30 апреля 2018

Рассмотрим базовые R ave функцию для запуска метода через уровни факторов. В частности, вы включаете ave() в ifelse, чтобы сохранить не пропущенные высоты и заменить пропущенные значения высоты:

df$imp_visit_height <- ifelse(is.na(df$visit_height), 
                              ave(df$visit_height, df$chart_number, 
                                  FUN=function(x) mean(x, na.rm=TRUE)), 
                              df$visit_height)

Или менее многословный эквивалент, используя within()

df <- within(df, imp_visit_height <- ifelse(is.na(visit_height), 
                                            ave(visit_height, chart_number, 
                                                FUN=function(x) mean(x, na.rm=TRUE)), 
                                            visit_height))

Для демонстрации со случайными данными, где номер_карты охватывает вычислительные языки / пакеты:

set.seed(43018)  # SEEDED FOR REPRODUCIBILITY

grp <- c("julia", "r", "pandas", "sas", "stata", "spss")

df <- data.frame(
  chart_number = replicate(100, sample(grp, 1, replace=TRUE)),
  time = as.Date(replicate(100, Sys.Date() - sample(1:120, 1, replace=TRUE)), 
                 origin="1970-01-01"),
  visit_height = rnorm(100, mean=50, sd=5),
  measurement = rnorm(100)*100
)

# RANDOMLY ASSIGN 25 ROWS WITH NA TO visit_height
df[sample(1:100, 25, replace=TRUE), c("visit_height")] <- NA

# CONDITIONALLY IMPUTE MISSING VALUES
df$imp_visit_height <- ifelse(is.na(df$visit_height), 
                              ave(df$visit_height, df$chart_number, 
                                  FUN=function(x) mean(x, na.rm=TRUE)), 
                              df$visit_height)

Выходные данные (фильтрация по отсутствующим значениям visit_height)

df[is.na(df$visit_height),]

#    chart_number       time visit_height measurement imp_visit_height
# 4           sas 2018-02-03           NA -116.072314         49.77708
# 6          spss 2018-04-02           NA   33.049215         52.05987
# 12        julia 2018-01-14           NA  135.954163         52.49936
# 14       pandas 2018-04-09           NA  -92.215212         49.23258
# 19         spss 2018-01-21           NA  -43.422507         52.05987
# 27        julia 2018-03-18           NA  -46.679790         52.49936
# 45       pandas 2018-03-19           NA -181.014747         49.23258
# 48        stata 2018-02-22           NA  -89.135797         51.12526
# 51         spss 2018-01-24           NA    9.784664         52.05987
# 53       pandas 2018-04-23           NA  106.461095         49.23258
# 55       pandas 2018-02-17           NA  121.749821         49.23258
# 58        julia 2018-01-19           NA -151.584425         52.49936
# 65       pandas 2018-03-04           NA -148.877957         49.23258
# 70            r 2018-01-05           NA   83.888427         49.29048
# 71          sas 2018-02-21           NA -213.640525         49.77708
# 73        julia 2018-04-18           NA  181.791644         52.49936
# 79            r 2018-03-09           NA   -4.446414         49.29048
# 82       pandas 2018-02-20           NA   28.069077         49.23258
# 84        julia 2018-02-27           NA   16.468641         52.49936
# 85         spss 2017-12-31           NA -106.316136         52.05987
# 86            r 2018-02-26           NA    1.450771         49.29048
# 91         spss 2018-04-05           NA  -34.662075         52.05987
# 93            r 2018-03-03           NA   36.777125         49.29048
# 95        julia 2018-01-20           NA  -36.827340         52.49936
# 98        julia 2017-12-31           NA  125.342483         52.49936
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...