2016-09-22 2 views
1

У меня есть фрейм данных с подобной продольной структурой, как data:перекодирование недостающих данных в продольных кадрах данных с R

data = data.frame (
    ID = c("a","a","a","b","b","b","c","c", "c"), 
    period = c(1,2,3,1,2,3,1,2,3), 
    size = c(3,3,NA, NA, NA,1, 14,14, 14)) 

Значения переменной size фиксируется так, что каждый период имеет то же значение для size , Однако в некоторых наблюдениях отсутствуют значения. Моя цель состоит в замене этих недостающих значений со значением size, связанным с периодами отсутствия (например, 3 для ID «a» и 1 для ID «b»).

Нужный кадр данных должен выглядеть что-то подобное:

data.1 

    ID period value 
     a  1  3 
     a  2  3 
     a  3  3 
     b  1  1 
     b  2  1 
     b  3  1 
     c  1 14 
     c  2 14 
     c  3 14 

Я пробовал различные комбинации ниже формулы, но я не получаю результат я ищу.

library(dplyr) 

data.1 = data %>% group_by(ID) %>% 
    mutate(new.size = ifelse(is.na(size), !is.na(size), 
          ifelse(!is.na(size), size, 0))) 

Это приводит к следующему:

data.1 
Source: local data frame [9 x 4] 
Groups: ID [3] 

     ID period size new.size 
    (fctr) (dbl) (dbl) (dbl) 
1  a  1  3  3 
2  a  2  3  3 
3  a  3 NA  0 
4  b  1 NA  0 
5  b  2 NA  0 
6  b  3  1  1 
7  c  1 14  14 
8  c  2 14  14 
9  c  3 14  14 

Я был бы признателен, если кто-то может дать мне подсказку о том, как получить правильное решение.

ответ

3

здесь другое решение с использованием dplyr с na.omit

group_by(data, ID) %>% 
    mutate(value=na.omit(size)[1]) 
Source: local data frame [9 x 4] 
Groups: ID [3] 

     ID period size value 
    <fctr> <dbl> <dbl> <dbl> 
1  a  1  3  3 
2  a  2  3  3 
3  a  3 NA  3 
4  b  1 NA  1 
5  b  2 NA  1 
6  b  3  1  1 
7  c  1 14 14 
8  c  2 14 14 
9  c  3 14 14 

отметить, что вы можете заменить na.omit с max(size, na.rm=TRUE), если вы ищете максимум, например.

3

Как об этом с основанием R:

vals <- unique(na.omit(data[, c("ID", "size")])) 
data$size <- vals$size[match(data$ID, vals$ID)] 


    ID period size 
1 a  1 3 
2 a  2 3 
3 a  3 3 
4 b  1 1 
5 b  2 1 
6 b  3 1 
7 c  1 14 
8 c  2 14 
9 c  3 14 
+2

Вы также можете использовать 'dplyr' i.e.' data%>% group_by (ID)%>% mutate (new.size = size [! Is.na (size)] [1]) ' – akrun

3

Чтобы исправить код, вы можете попробовать следующее с dplyr

library(dplyr) 
data %>% group_by(ID) %>% 
     mutate(new.size = ifelse(is.na(size), size[!is.na(size)],size)) 

#  ID period size new.size 
#  (fctr) (dbl) (dbl) (dbl) 
#1  a  1  3  3 
#2  a  2  3  3 
#3  a  3 NA  3 
#4  b  1 NA  1 
#5  b  2 NA  1 
#6  b  3  1  1 
#7  c  1 14  14 
#8  c  2 14  14 
#9  c  3 14  14 

Или в base R альтернативы с ave

data$new.size <- ave(data$size,data$ID, FUN=function(x)unique(x[!is.na(x)])) 
data$new.size 

#[1] 3 3 3 1 1 1 14 14 14 
Смежные вопросы