2013-12-04 2 views
1

Я пытаюсь заполнить недостающие значения, случайно выбранные из столбца. Например, для переменной «яблоко» данные выглядят как (1, 2, 3, NA), тогда я хочу, чтобы NA произвольно вменялось в (1,2,3). Я придумал следующий код, но я пытаюсь сделать так, чтобы R вменяет из соответствующей колонки, а не весь набор данныхвменять отсутствующие значения из соответствующего столбца

random.imp <- function (a){ 
missing <- is.na(a) 
n.missing <- sum(missing) 
a.obs <- a[!missing] 
imputed <- a 
imputed[missing] <- sample (a.obs, n.missing, replace=TRUE) 
return (imputed) 
} 
train.num<- random.imp (train.num) 

Я думаю, что есть что-то не так с кодом после sample , и любые комментарии действительно помогут!

ответ

2

EDIT обновлены для работы на dataframe

# MAKE THE DATA 
train.num<-data.frame(var=sample(c("a","b","v","h","i"),10,TRUE), 
         c1=sample(c(NA,1,4,8),10,T), 
         c2=sample(c(NA,2,3,0),10,T), 
         c3=sample(c(NA,5,9,11),10,T)) 

# CALL THE FUNCTION 
random.imp <- function (a){ 

    n<-length(a[is.na(a)]) 
    a[is.na(a)]<-sample(unique(a[!is.na(a)]),n,TRUE) 
    return(a) 

} 

# USE APPLY TO RUN THE FUNCTION COLWISE (in this case for columns 2-4) 
train.num[,2:4]<-apply(train.num[,2:4],2,function(x)random.imp(x)) 
+0

Спасибо, но это дало тот же результат - это, кажется, не вменяя из колонки, но из всего набора данных ! Например, для данных, которые я проверил, исходные данные были (1, 2, 0, NA), но после запуска кода он был (1, 2, 2000, NA) (2000 был помещен из другого столбца). – song0089

+0

ОК, в этом случае вам нужно использовать apply для запуска функции colwise - код, измененный выше – Troy

0
random.imp <- function(a){ 
    a[is.na(a)] <- sample(x = a[!is.na(a)], size = sum(is.na(a)), replace = TRUE) 
    return(a) 
} 

df <- data.frame(x = c(1, NA, 3, 4, NA), y = c(NA, 6, NA, 5, NA)) 
df 
# x y 
# 1 1 NA 
# 2 NA 6 
# 3 3 NA 
# 4 4 5 
# 5 NA NA 

df[] <- lapply(df, random.imp) 
df 
# x y 
# 1 1 5 
# 2 1 6 
# 3 3 6 
# 4 4 5 
# 5 1 6 
Смежные вопросы