Преобразование значений NA на основе регистрации первого значения - PullRequest
0 голосов
/ 10 января 2019

У меня есть такие данные:

    Date 1   Date 2    Date 3    Date 4    Date 5
  A  NA       0.1       0.2       NA        0.3
  B  0.1      NA        NA        0.3       0.2
  C  NA       NA        NA        NA        0.3
  D  0.1      0.2       0.3       0.1       NA
  E  NA       NA        0.1       0.2       0.1

Я хотел бы изменить значения NA моих данных, основываясь на первой дате регистрации значения. Так, например, для А первая регистрация - Дата 2. Затем я хочу, чтобы перед этой регистрацией значения NA в А были равны 0, а после первой регистрации значения NA стали средними значениями зарегистрированных значений. В случае C все значения NA станут 0, так как первая регистрация в последний день.

Получите что-то вроде этого:

    Date 1   Date 2    Date 3    Date 4    Date 5
  A  0       0.1       0.2        0.2       0.3
  B  0.1     0.2       0.2        0.3       0.2
  C  0       0         0          0         0.3
  D  0.1     0.2       0.3        0.1       0.175
  E  0       0         0.1        0.2        0.1

Вы можете мне помочь? Я не уверен, как это сделать в R.

EDIT: Что делать, если я хочу, чтобы среднее значение значений между ними? В этом случае для A измените NA в Date 4 для среднего значения Date 3 и 5.

1 Ответ

0 голосов
/ 10 января 2019
Подход

A tidyverse, мы создаем индекс для gather, присваивая row_number() каждой строке. Затем мы group_by каждые row и находим первое не-NA значение в значениях row и replace каждые NA до этого в 0, а все остальные значения NA после этого в mean. Наконец, spread переменные возвращаются в широкий формат, удаляя ненужные столбцы, созданные во время вычисления.

library(tidyverse)

df %>% 
  mutate(row = row_number()) %>%
  gather(key, value, -row) %>%
  group_by(row) %>%
  mutate(value1 = replace(value, is.na(value) & row_number() < which.max(!is.na(value)), 0), 
         value2 = replace(value1, is.na(value1), mean(value, na.rm = TRUE))) %>%
  ungroup() %>%
  select(-value1, -value) %>%
  spread(key, value2) %>%
  select(-row)


# Date1 Date2 Date3 Date4 Date5
#  <dbl> <dbl> <dbl> <dbl> <dbl>
#1 0.    0.100 0.200 0.200 0.300
#2 0.100 0.200 0.200 0.300 0.200
#3 0.    0.    0.    0.    0.300
#4 0.100 0.200 0.300 0.100 0.175
#5 0.    0.    0.100 0.200 0.100

Базовый подход R с использованием apply для каждой строки

t(apply(df, 1, function(x) {
   inds <- which.max(!is.na(x))
   x[inds:length(x)] <- replace(x[inds:length(x)], is.na(x[inds:length(x)]),
                         mean(x[inds:length(x)], na.rm = TRUE))
  x[1:inds] <- replace(x[1:inds], is.na(x[1:inds]), 0)
  x
}))


#  Date1 Date2 Date3 Date4 Date5
#A   0.0   0.1   0.2   0.2 0.300
#B   0.1   0.2   0.2   0.3 0.200
#C   0.0   0.0   0.0   0.0 0.300
#D   0.1   0.2   0.3   0.1 0.175
#E   0.0   0.0   0.1   0.2 0.100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...