2017-01-22 10 views
0

Я пытаюсь приписать фреймворк модели Hmisc impute. Я могу передавать данные за один столбец за раз, но не зацикливать столбцы.Зацикливание над каждым столбцом для передачи данных в R, но не заменяет вмененные данные.

Ниже пример - работает отлично, но я хотел бы сделать его динамическим, используя функцию:

impute_marks$col1 <- with(impute_marks, round(impute(col1, mean)),0) 

Пример:

impute_dataframe <- function() 
{ 
    for(i in 1:ncol(impute_marks)) 
    { 
    impute_marks[is.na(impute_marks[,i]), i] <- with(impute_marks, round(impute(impute_marks[,i], mean)),0) 
    } 
} 
impute_dataframe 

Там нет ошибки, когда я запустить функцию, но там нет вмененных данных, а также в данные impat_marks.

ответ

1

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

library(Hmisc) 
age1 <- c(1,2,NA,4) 
age2 <- c(NA, 4, 3, 1) 
mydf <- data.frame(age1, age2) 

mydf 
    age1 age2 
1 1 NA 
2 2 4 
3 NA 3 
4 4 1 

apply(mydf, 2, function(x) {round(impute(x, mean))}) 
    age1 age2 
1 1 3 
2 2 4 
3 2 3 
4 4 1 

EDIT: Для того, чтобы сохранить mydf как data.frame вы могли coherce его обратно, как это:

mydf <- as.data.frame(mydf) 

Но я бы использовал другой пакет purrr, который представляет собой хороший набор инструментов вокруг этой идеи приложения/сопоставления. map_df, например, всегда будет возвращать data.frame объект, есть куча map_x, которые вы можете увидеть ?map

library(purrr) 
map_df(mydf, ~ round(impute(., mean))) 

Я знаю, что предпочтительнее использовать базовые функции R, но purrr делает apply операции стиль намного проще ,

+1

Я довольно новичок в Р. Я не знал о применении функции. Спасибо, что указали это. Я смог добиться того, чего хотел, но в конце операции получаю матрицу, а не кадр данных. Как я могу преобразовать его в кадр данных после вменения. это то, что я получил: num [1: 153, 1:26] 55 68 .... все значения. а не 153 об. 26 переменных –

+0

Я получил это решение, обернув всю правую сторону, используя as.data.frame() –

+0

, если вы так много делаете, проверьте 'library (purrr)' он имеет хороший синтаксис, и я думаю, что он более интуитивно понятен чем базовые функции 'apply',' lapply' и т. д. – Nate

1

Мы можем использовать na.aggregate из zoo, который может быть нанесен непосредственно на наборе

library(zoo) 
round(na.aggregate(mydf)) 
# age1 age2 
#1 1 3 
#2 2 4 
#3 2 3 
#4 4 1 

или в каждой колонке отдельно с lapply

mydf[] <- lapply(mydf, function(x) round(na.aggregate(x))) 

По умолчанию na.aggregate дает mean. Но мы можем изменить FUN