Zastąp brakujące wartości średnią w kolumnie

Nie jestem pewien, jak zapętlić każdą kolumnę, aby zastąpić wartości NA średnią kolumnową. Kiedy próbuję zastąpić jedną kolumnę za pomocą poniższego, działa dobrze.

Column1[is.na(Column1)] <- round(mean(Column1, na.rm = TRUE))

Kod do zapętlania kolumn nie działa:

for(i in 1:ncol(data)){
    data[i][is.na(data[i])] <- round(mean(data[i], na.rm = TRUE))
}

Wartości nie są zastępowane. Czy ktoś może mi z tym pomóc?

Author: zx8754, 2014-09-14

8 answers

Stosunkowo prosta modyfikacja kodu powinna rozwiązać problem:

for(i in 1:ncol(data)){
  data[is.na(data[,i]), i] <- mean(data[,i], na.rm = TRUE)
}
 45
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 17:07:27

Jeśli DF jest ramką danych kolumn numerycznych:

library(zoo)
na.aggregate(DF)

Dodany:

Używając tylko podstawy R zdefiniuj funkcję, która robi to dla jednej kolumny, a następnie lapply do każdej kolumny:

NA2mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))
replace(DF, TRUE, lapply(DF, NA2mean))

Ostatnią linię można zastąpić następującym tekstem, jeśli można nadpisać dane wejściowe:

DF[] <- lapply(DF, NA2mean)
 35
Author: G. Grothendieck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-14 13:38:14

Aby dodać do alternatyw, używając przykładowych danych @akrun, wykonałbym następujące czynności:

d1[] <- lapply(d1, function(x) { 
  x[is.na(x)] <- mean(x, na.rm = TRUE)
  x
})
d1
 9
Author: A5C1D2H2I1M1N2O1R2T1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 17:43:24

Możesz też spróbować:

 cM <- colMeans(d1, na.rm=TRUE)
 indx <- which(is.na(d1), arr.ind=TRUE)
 d1[indx] <- cM[indx[,2]]
 d1  

Dane

set.seed(42)
d1 <- as.data.frame(matrix(sample(c(NA,0:5), 5*10, replace=TRUE), ncol=10))
 5
Author: akrun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 17:19:45

lapply może być używany zamiast pętli for.

d1[] <- lapply(d1, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))

To tak naprawdę nie ma żadnych zalet w stosunku do pętli for, chociaż może jest łatwiej, jeśli masz również kolumny nie-numeryczne, w takim przypadku

d1[sapply(d1, is.numeric)] <- lapply(d1[sapply(d1, is.numeric)], function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))
To prawie tak samo proste.
 3
Author: Ista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-17 15:51:48
# Lets say I have a dataframe , df as following -
df <- data.frame(a=c(2,3,4,NA,5,NA),b=c(1,2,3,4,NA,NA))

# create a custom function
fillNAwithMean <- function(x){
    na_index <- which(is.na(x))        
    mean_x <- mean(x, na.rm=T)
    x[na_index] <- mean_x
    return(x)
}

(df <- apply(df,2,fillNAwithMean))
   a   b
2.0 1.0
3.0 2.0
4.0 3.0
3.5 4.0
5.0 2.5
3.5 2.5
 2
Author: shekhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 18:39:35

Podobne do odpowiedzi podanej przez @ Tomasz, Można to również zrobić za pomocą metody ifelse() R:

for(i in 1:ncol(data)){
  data[,i]=ifelse(is.na(data[,i]),
                  ave(data[,i],FUN=function(y) mean(y, na.rm = TRUE)),
                  data[,i])
}

Gdzie, argumenty do ifelse(TEST, YES , NO) to:-

TEST - warunek logiczny do sprawdzenia

YES - wykonywane, jeśli warunek jest prawdziwy

NO - else gdy warunek jest False

I ave(x, ..., FUN = mean) jest metodą w R stosowaną do obliczania średnich podzbiorów x []

 1
Author: Aseem Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 06:07:27

Istnieje również szybkie rozwiązanie przy użyciu pakietu imputeTS :

library(imputeTS)
na.mean(yourDataFrame)
 1
Author: stats0007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-04 00:20:04