Замените NA другим значением строки на основе идентификатора - PullRequest
0 голосов
/ 02 апреля 2019

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

Ниже части таблицы

   XCODE Age Sex ResultA ResultB ResultC
1   X001  12   2       2       3       4
2   X002  23   2       4       6      66
3   X003  NA  NA      NA      NA      NA
4   X004  32   1       1       7       3
5   X005  NA  NA      NA      NA      NA
6   X001  NA  NA      NA      NA      NA
7   X002  NA  NA      NA      NA      NA
8   X003  33   1       8       7       6
9   X004  NA  NA      NA      NA      NA
10  X005  55   2       8       8       8

У меня есть файл SPSS с более чем 6000 столбцами.

Iиспользуется

library(data.table)
setDT(dataset)[, Age:= Age[!is.na(Age)][1L] , by = XCODE]

, но это хорошо только для одного столбца, и мне нужно иметь дело со многими столбцами.

Так как мне выполнить код выше для всех столбцов?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Мы можем сгруппировать по XCODE и использовать fill() для заполнения NA с последним не-NA.В этом случае нам нужно заполнить оба направления.Также обратите внимание, что, поскольку вы заполняете все переменные, тогда можно использовать функцию everything()

library(tidyverse)

df %>% 
 group_by(XCODE) %>% 
 fill(everything()) %>% 
 fill(everything(), .direction = 'up')

, которая дает

# A tibble: 10 x 6
# Groups:   XCODE [5]
   XCODE   Age   Sex ResultA ResultB ResultC
   <fct> <int> <int>   <int>   <int>   <int>
 1 X001     12     2       2       3       4
 2 X001     12     2       2       3       4
 3 X002     23     2       4       6      66
 4 X002     23     2       4       6      66
 5 X003     33     1       8       7       6
 6 X003     33     1       8       7       6
 7 X004     32     1       1       7       3
 8 X004     32     1       1       7       3
 9 X005     55     2       8       8       8
10 X005     55     2       8       8       8
0 голосов
/ 02 апреля 2019

Используя data.table, мы можем выбрать столбцы, которые мы хотим replace

library(data.table)
setDT(df)[, (2:ncol(df)) := lapply(.SD, function(x) 
            replace(x, is.na(x), x[!is.na(x)][1])) , XCODE]

df
#    XCODE Age Sex ResultA ResultB ResultC
# 1:  X001  12   2       2       3       4
# 2:  X002  23   2       4       6      66
# 3:  X003  33   1       8       7       6
# 4:  X004  32   1       1       7       3
# 5:  X005  55   2       8       8       8
# 6:  X001  12   2       2       3       4
# 7:  X002  23   2       4       6      66
# 8:  X003  33   1       8       7       6
# 9:  X004  32   1       1       7       3
#10:  X005  55   2       8       8       8

Используя ту же логику в dplyr, мы можем заменить NA s на первые не-Значение NA группы для всех столбцов

library(dplyr)

df %>%
  group_by(XCODE) %>%
  mutate_all(~replace(., is.na(.), .[!is.na(.)][1]))


#  XCODE   Age   Sex ResultA ResultB ResultC
#   <fct> <int> <int>   <int>   <int>   <int>
# 1 X001     12     2       2       3       4
# 2 X002     23     2       4       6      66
# 3 X003     33     1       8       7       6
# 4 X004     32     1       1       7       3
# 5 X005     55     2       8       8       8
# 6 X001     12     2       2       3       4
# 7 X002     23     2       4       6      66
# 8 X003     33     1       8       7       6
# 9 X004     32     1       1       7       3
#10 X005     55     2       8       8       8

Или только выбранные столбцы

cols <- c("Age", "Sex", "ResultA","ResultB")
df %>%
  group_by(XCODE) %>%
  mutate_at(vars(cols), ~ replace(., is.na(.), .[!is.na(.)][1]))

...