Примените условие ifelse () к нескольким столбцам в кадре данных для значений NA, используя формулу, которая использует формулу, ссылающуюся на другое значение из столбца - PullRequest
0 голосов
/ 02 апреля 2020

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

Один столбец «А» имеет полный набор из 6 значений. Остальные 5 столбцов с «v1» по «v5» случайным образом имеют 2 пропущенных значения, каждое из которых помечено NA.

df <- data.frame('A' = c(2, 4, 7, 5, 3, 4), 'v1' = c(3, NA, NA, 4, 5, 5),
                 'v2' = c(NA, NA, 6, 4, 5, 5), 'v3' = c(3, 4, NA, NA, 5, 5),
                 'v4' = c(3, 4, 6, 4, NA, NA), 'v5' = c(3, 4, 6, NA, NA, 5))
  A   v1   v2   v3   v4   v5
1 2 3.00 1.75 3.00 3.00 3.00
2 4 3.55 3.55 4.00 4.00 4.00
3 7 6.25 6.00 6.25 6.00 6.00
4 5 4.00 4.00 4.45 4.00 4.45
5 3 5.00 5.00 5.00 2.65 2.65
6 4 5.00 5.00 5.00 3.55 5.00

Что я хотел бы сделать, это заполнить все NA в кадре данных, используя уравнение: -0,05 + 0,9 * х. Где x соответствует значению в столбце A в той же строке. Например:

Для строки 1 v1, где есть первый NA, Col A = 4. Поэтому я хотел бы, чтобы этот NA был заполнен следующим образом:

-0.05 + 0.9 * 4 = 3,55 ------- Заполнено 3,55

И для v1 строки 3 NA, где Col A = 7. Я бы хотел -0,05 + 0,9 * 7 = 6,25 ------ с 6.25

Я пытался использовать функцию ifelse (), но не знаю, как применить ее ко всему фрейму данных и связать ее с уравнением, которое использует значение из другого столбца в той же строке.

Моя попытка ниже, что, я знаю, неверно, но дает представление о моем подходе к ней:

ifelse(df$v1:v5 == NA, -0.05 + 0.9*df$A, df$v1:v5)

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

A dplyr (tidyverse) решение на основе:

library(dplyr)

my_df <- data.frame('A' = c(2, 4, 7, 5, 3, 4), 'v1' = c(3, NA, NA, 4, 5, 5),
                    'v2' = c(NA, NA, 6, 4, 5, 5), 'v3' = c(3, 4, NA, NA, 5, 5),
                    'v4' = c(3, 4, 6, 4, NA, NA), 'v5' = c(3, 4, 6, NA, NA, 5))

my_df %>% mutate_at(vars(-A), ~ifelse(is.na(.), -0.05 + 0.9 * A, .))

Результат:

  A   v1   v2   v3   v4   v5
1 2 3.00 1.75 3.00 3.00 3.00
2 4 3.55 3.55 4.00 4.00 4.00
3 7 6.25 6.00 6.25 6.00 6.00
4 5 4.00 4.00 4.45 4.00 4.45
5 3 5.00 5.00 5.00 2.65 2.65
6 4 5.00 5.00 5.00 3.55 5.00
1 голос
/ 02 апреля 2020

Ниже приводится все oop и работающее, но не очень элегантное решение. Возможно, вы получите другие ответы.

Indizes = which(is.na(df), arr.ind = TRUE)
for (i in 1:(dim(Indizes)[1])){
      df[Indizes[i, 1], Indizes[i, 2]] = -0.05 + 0.9*df[Indizes[i, 1], 1]
  }

Вывод:

  A   v1   v2   v3   v4   v5
1 2 3.00 1.75 3.00 3.00 3.00
2 4 3.55 3.55 4.00 4.00 4.00
3 7 6.25 6.00 6.25 6.00 6.00
4 5 4.00 4.00 4.45 4.00 4.45
5 3 5.00 5.00 5.00 2.65 2.65
6 4 5.00 5.00 5.00 3.55 5.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...