#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