Замените NAs на n наиболее частых значений

#r #vector #replace #na

#r #вектор #заменять #na

Вопрос:

Вот 2 фиктивных вектора:

 set.seed(10) vec1 lt;- c(1,1,5,1,2,5,1,7,9,1,3,1,1,2 ,2, 1, 2, 1, 3, 1,1,1,1,1,1,2,5,1,1,1,1,1,1,1,1,1,1,2,3,1,1,2,1,7,1,7,2,1,1,1) vec lt;- c(1,1,5,1,2,5,1,7,9,1,3,1,1,2 ,2, 1, 2, 1, 3, 1,1,1,1,1,1,2,5,1,NA, NA, NA, NA, NA, NA, NA)  

Я хотел бы заменить отсутствующие значения в vec 4 наиболее частыми значениями в vec1. Я хотел бы отсортировать эти значения случайным образом (вставить их вместо NAs в случайном порядке, а не, например, от наибольшего к наименьшему и т. Д.).

Я написал следующий код:

 # take 4 most frequent values mfv lt;- as.numeric(names(sort(table(vec1),decreasing=TRUE)[1:4]))  # replace result lt;- lapply(vec, function(n) replace(n, is.na(n), as.integer(mfv)))  

Заменяемая деталь не работает. Как это должно быть сделано? Я хотел бы отметить, что данные IRL могут содержать количество NAS, кратное количеству выбранных MFV, или нет — реальный набор данных велик и разнообразен.

Я был бы признателен за любую помощь.

Комментарии:

1. Как насчет vec[is.na(vec)]lt;-sample(mfv,sum(is.na(vec)),T) этого ?

2. Это именно то, чего я хотел. И в другом сценарии, если бы мне пришлось применить эту функцию через список — как бы это было?

3. Оберните функциональность в функцию и используйте lapply или sapply для просмотра списка и выполнения замены.

4. Я сделал это: result_split