R рассчитать данные, используя горизонтальное среднее / режим / и т. Д. - PullRequest
1 голос
/ 12 февраля 2012

У меня есть фрейм данных, и я хотел бы рассчитать пропущенные значения на основе среднего значения строки вместо среднего значения столбца.

id       Price1         Price2           Price3        Price4    HorizontalMean
004        NA             101              103           114            106
005       100             108               78            99             96.25
006        34              33               NA            78             48.333
...

Я просмотрел несколько пакетов и, похоже, не нашел ни одного, который бы прямо упоминал об этом.Любые рекомендации или мне нужно сначала сделать транспонирование (это может быть проблемой, так как данные> 100k строк).

Ответы [ 2 ]

4 голосов
/ 12 февраля 2012

Вот милая маленькая строчка:

> df <- data.frame(Price1 = c(NA, 100, 34),
+                  Price2 = c(101, 108, 33),
+                  Price3 = c(103, 78, NA),
+                  Price4 = c(114, 99, 78))
> df
  Price1 Price2 Price3 Price4
1     NA    101    103    114
2    100    108     78     99
3     34     33     NA     78

> df <- ifelse(is.na(df), rowMeans(df, na.rm=TRUE), unlist(df))
> df
     Price1 Price2    Price3 Price4
[1,]    106    101 103.00000    114
[2,]    100    108  78.00000     99
[3,]     34     33  48.33333     78

РЕДАКТИРОВАТЬ: для @Charlie, который спросил, как бы вы заменили NA на столбцы, вы можете использовать то же самое, но заменить rowMeans (...) на вектор, повторяющий столбец, означает:

df <- ifelse(is.na(df), rep(colMeans(df, na.rm=TRUE), rep(nrow(df), ncol(df))),
             unlist(df))

или применить ifelse к каждому столбцу списка:

df <- sapply(df, function(x)ifelse(is.na(x), mean(x, na.rm=TRUE), x))
3 голосов
/ 12 февраля 2012

Вы можете сделать это вручную, с помощью apply и ifelse.

# Sample data
d <- matrix(rnorm(20), nc=2)
d[ sample(1:20,3) ] <- NA
d <- as.data.frame(d)
d$mean <- apply(d, 1, mean, na.rm=TRUE)

# Replace missing values, only in the first two columns
d[,1:2] <- apply( 
  d[,1:2], 
  2, 
  function(u) ifelse(is.na(u), d$mean, u) 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...