Заменить na´s в определенных столбцах на медиану тех же столбцов - PullRequest
0 голосов
/ 14 ноября 2018

Я бы хотел заменить начальные значения в v1 на v4 медианой тех же столбцов

Вот некоторые примеры данных

id <- c(1,2,3,4)
v1 <- c(1,3,0,2)
v2 <- c(NA,1,NA,2)
v3 <- c(2,4,1,2)
v4 <- c(NA,1,0,2)
v5 <- c(5,1,NA,2)
v6 <- c(7,1,9,NA)

df <- data.frame(id, v1, v2, v3,v4,v5,v6)
df_pre <- df %>% group_by(id) %>% mutate(Median_v1_v4 = median(c(v1,v2,v3,v4), na.rm=TRUE))

Вот как эти данные выглядят сейчас:

id v1 v2 v3 v4 v5 v6  Median_v1_v4
 1  1 NA  2 NA  5  7          1.5
 2  3  1  4  1  1  1          2.0
 3  0 NA  1  0 NA  9          0.0
 4  2  2  2  2  2 NA          2.0

Вот как я хочу, чтобы данные выглядели

id v1  v2 v3  v4 v5 v6 Median_v1_v4
1  1 1.5  2 1.5  5  7          1.5
2  3 1.0  4 1.0  1  1          2.0
3  0 0.0  1 0.0 NA  9          0.0
4  2 2.0  2 2.0  2 NA          2.0

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Можно попробовать

library(tidyverse)
df %>% 
  gather(k, v, -id) %>% 
  group_by(id) %>%   
  mutate(Median=median(v[k %in% c("v1", "v2", "v3","v4")], na.rm = T)) %>% 
  mutate(v=ifelse(is.na(v) & k %in% c("v1", "v2", "v3","v4"), Median, v)) %>% 
  spread(k, v)
# A tibble: 4 x 8
# Groups:   id [4]
     id Median    v1    v2    v3    v4    v5    v6
  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1    1.5     1   1.5     2   1.5     5     7
2     2    2       3   1       4   1       1     1
3     3    0       0   0       1   0      NA     9
4     4    2       2   2       2   2       2    NA
0 голосов
/ 14 ноября 2018

Посмотрите на этот код.

library(tidyverse)
id <- c(1,2,3,4)
v1 <- c(1,3,0,2)
v2 <- c(NA,1,NA,2)
v3 <- c(2,4,1,2)
v4 <- c(NA,1,0,2)
v5 <- c(5,1,NA,2)
v6 <- c(7,1,9,NA)

df <- data.frame(id, v1, v2, v3,v4,v5,v6)
df_pre <- df %>% 
  group_by(id) %>% 
  mutate(Median_v1_v4 = median(c(v1,v2,v3,v4), na.rm=TRUE))

df_pre %>% 
  mutate_at(vars(v1,v2,v3,v4),  
            funs(replace(., is.na(.), Median_v1_v4))) -> df_pre
0 голосов
/ 14 ноября 2018

А как насчет этого решения:

df[,2:5] <- t( apply(df[,2:5], 1, function(x) { 
  x[is.na(x)] <- median(x,na.rm=T)
  return(x)}
) )

df

  id v1  v2 v3 v4 v5 v6
1  1  1 1.0  2  1  5  7
2  2  3 1.0  4  1  1  1
3  3  0 0.5  1  0 NA  9
4  4  2 2.0  2  2  2 NA

Отрегулировано с: Заменить значения NA на рядные значения

PS: увидел комментарий слишком поздно (@Sai Saran), это корректировка решения по ссылке выше.

...