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?
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)
}
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)
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
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))
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.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
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 []
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)
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