Использование функции na_ma в числовом фрейме данных в R

#r #dataframe #imputets

Вопрос:

Я пытаюсь использовать функцию na_ma from library(imputeTS) ; потому что я имею дело с пропущенными значениями во фрейме данных, заменяя их средним значением окружающих значений.

Пример данных:

 i1<-c(5,4,3,4,5)
i2<-c(2,NA,4,5,3)
i3<-c(NA,4,4,4,5)
i4<-c(3,5,5,NA,2)
data<-as.data.frame(cbind(i1,i2,i3,i4))
data
 

Мой код

 data %>%
    rowwise %>%
        na_ma(as.numeric(x), k = 1, weighting = "simple")
 

Ожидаемый результат:

 i1 i2 i3 i4
1  5  2 2.5  3
2  4  4  4  5
3  3  4  4  5
4  4  5  4 4.5
5  5  3  5  2
 

Проблема в том, что я не знаю, как применить na_ma(as.numeric(x), k = 1, weighting = "simple") к каждой строке этого фрейма данных.

Спасибо!

Ответ №1:

Если вы хотите использовать tidyverse для этого, вы можете использовать pmap_df .

 library(dplyr)
library(purrr)

data %>%
  pmap_df(~imputeTS::na_ma(c(...), k = 1, weighting = "simple"))

#     i1    i2    i3    i4
#  <dbl> <dbl> <dbl> <dbl>
#1     5     2   2.5   3  
#2     4     4   4     5  
#3     3     4   4     5  
#4     4     5   4     4.5
#5     5     3   5     2  
 

Это также можно сделать в базе R —

 data[] <- t(apply(data, 1, imputeTS::na_ma, k = 1, weighting = "simple"))
 

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

1. Большое вам спасибо за включение кода с базой R! Оба работают идеально!

Ответ №2:

Ты действительно уверен, что хочешь это сделать? Обычно мы вменяем по столбцам, со средним значением столбцов.

 cm <- colMeans(dat, na.rm=TRUE)
dat <- Map((x, y) ifelse(is.na(x), y, x), data, cm) |>
  as.data.frame()
dat
#   i1  i2   i3   i4
# 1  5 2.0 4.25 3.00
# 2  4 3.5 4.00 5.00
# 3  3 4.0 4.00 5.00
# 4  4 5.0 4.00 3.75
# 5  5 3.0 5.00 2.00
 

На самом деле лучше использовать более сложные методы вменения, такие как множественное вменение. Вот такое чтение.


Данные

 dat <- structure(list(i1 = c(5, 4, 3, 4, 5), i2 = c(2, NA, 4, 5, 3), 
    i3 = c(NA, 4, 4, 4, 5), i4 = c(3, 5, 5, NA, 2)), class = "data.frame", row.names = c(NA, 
-5L))
 

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

1. Спасибо вам за то, что включили это чтение.