2015-08-12 2 views
1

Есть ли лучший способ пройти наблюдения в кадре данных и ввести значения NA? Я собрал цикл «for», который, похоже, выполняет эту работу, заменяя NA с средним значением строки, но мне интересно, есть ли лучший подход, который не использует цикл for для решения этой проблемы - возможно, встроенная функция R?Замена или вменение значений NA в R без цикла Loop

# 1. Create data frame with some NA values. 

rdata <- rbinom(30,5,prob=0.5) 
rdata[rdata == 0] <- NA 
mtx <- matrix(rdata, 3, 10) 
df <- as.data.frame(mtx) 
df2 <- df 

# 2. Run for loop to replace NAs with that row's mean. 

for(i in 1:3){   # for every row 
x <- as.numeric(df[i,]) # subset/extract that row into a numeric vector 
y <- is.na(x)    # create logical vector of NAs 
z <- !is.na(x)   # create logical vector of non-NAs 
result <- mean(x[z])  # get the mean value of the row 
df2[i,y] <- result  # replace NAs in that row 
} 

# 3. Show output with imputed row mean values. 

print(df) # before 
print(df2) # after 
+1

, когда вы предоставляете данные с генерацией случайных чисел – mlegge

+2

@akrun, хорошая находка. Кажется, ответ такой же, как у меня. О, ну, великие мысли думают так, как я думаю :) –

+0

@akrun imo, этот вопрос не тождественен ... ни один ответ не был принят по другому вопросу OP. ;) Я действительно думаю, что это помогает другим учиться, видя различные способы приближения и задавая связанный с ним вопрос, особенно в Р. Ответы на объяснения и структуру этого вопроса, я считаю, имеют определенную ценность. – bridgbro

ответ

5

Вот возможный Векторизованный подход (без петли)

indx <- which(is.na(df), arr.ind = TRUE) 
df[indx] <- rowMeans(df, na.rm = TRUE)[indx[,"row"]] 

Некоторых объяснения

Мы можем определить местоположение в NA с помощью параметра arr.ind в which , Затем мы можем просто индексировать df (по индексам строк и столбцов), а строка означает (только по индексам строк) и соответственно заменить значения

+0

@akrun Спасибо mate :) –

2

Одним из возможных вариантов, с помощью impute из Hmisc, что позволяет выбрать любую функцию, чтобы сделать вменение,

library(Hmisc) 
t(sapply(split(df2, row(df2)), impute, fun=mean)) 

Кроме того, вы можете скрыть петля в apply

t(apply(df2, 1, function(x) { 
    mu <- mean(x, na.rm=T) 
    x[is.na(x)] <- mu 
    x 
})) 
3

Данные:

set.seed(102) 
rdata <- matrix(rbinom(30,5,prob=0.5),nrow=3) 
rdata[cbind(1:3,2:4)] <- NA 
df <- as.data.frame(rdata) 

Это немного сложнее, чем хотелось бы - он полагается на упорядочение матриц в столбцах в R, а также на рециркуляцию вектора строк по всей длине матрицы. Я попытался придумать решение sweep(), но до сих пор не справился.

rmeans <- rowMeans(df,na.rm=TRUE) 
df[] <- ifelse(is.na(df),rmeans,as.matrix(df)) 
+0

thx (хотя это и не имеет значения) –

+1

потому что 'rdata' и' df' в основном одинаковы (одна - это матрица, другая - фрейм данных) –

Смежные вопросы