R средние значения без NA - PullRequest
       9

R средние значения без NA

0 голосов
/ 04 февраля 2019

Моя проблема объяснена на прилагаемой картинке (ссылка).

link image description problem

Я пробовал следующие коды без результата:

df[paste0("combined_", df_of_column_names)] <- lapply(df, ave, na.rm =TRUE, df[["index Z"]]) 

, который невозвращает среднее значение, где присутствуют NA

df[paste0("combined_", df_of_column_names)] <- lapply(df, ave(FUN=function(x) mean(x, na.rm=T)), df[["index Z"]]) 

, которое выдает ошибку:

Ошибка в FUN (x): аргумент "x" отсутствует, по умолчанию нет

Может ли кто-нибудь помочь мне с этим?Большое спасибо!

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Используя базовый RI удалось заставить это работать в простом случае, похожем на ваш.

attach(warpbreaks)
wool[5] <- NA
df <- data.frame(wool = wool, break = breaks)
df <- cbind(df, df$wool)

df
   wool breaks breaks.1
1     A     26       26
2     A     30       30
3     A     54       54
4     A     25       25
5     A     NA       NA
6     A     52       52
...

lapply(df[,-1], function(x) ave(x, df[,1], FUN = function(x) mean(x, na.rm=TRUE)))

$breaks
 [1] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
 [9] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[17] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[25] 29.53846 29.53846 29.53846 25.25926 25.25926 25.25926 25.25926 25.25926
[33] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[41] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[49] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926

$breaks.1
 [1] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
 [9] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[17] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[25] 29.53846 29.53846 29.53846 25.25926 25.25926 25.25926 25.25926 25.25926
[33] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[41] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[49] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
0 голосов
/ 04 февраля 2019

Использование библиотеки dplyr.Проверьте этот пример:

df1 %>% group_by(index) %>%
  summarise(modreturn1 = mean(return1,na.rm = T), modreturn2 = mean(return2,na.rm = T))

Он вернет таблицу, суммирующую первые две переменные в их средние значения (исключая NA).Теперь, если вам действительно нужно столько строк, сколько содержится в исходном наборе данных: сначала сохраните указанный выше запрос в переменную с именем resumen, затем:

merge(df1[,"index"],resumen,all.x = T)

Добро пожаловать:)

0 голосов
/ 04 февраля 2019

Аналогично ANG, но с использованием data.table

library(data.table)
df <- setDT(df)
df2 <- df[,lapply(.SD,mean), by = `index Z`]
df2[df, on = `index Z`]
0 голосов
/ 04 февраля 2019

Без воспроизводимого примера сложно дать соответствующий ответ, но попробуйте:

library(dplyr)
df2 <- df %>% # df is your data frame
        group_by(`index Z`) %>% 
        summarise_all(.funs = mean, na.rm = TRUE) 
# expected output
left_join(df1[, 1], df2, by = `index Z`)
...