Заполните значения строки справа от некоторого значения - PullRequest
0 голосов
/ 21 ноября 2018

Учитывая следующий фрейм данных, мне нужно иметь возможность заполнять значения в каждой строке справа, пока не встретится следующее значение, в этом случае мне нужно заполнить это значение и т. Д., Пока я не достигну конца строки,

# load data
id <- LETTERS[1:7]
X2000 <-  c(NA,NA,NA,NA,100,NA,NA)
X2001 <- c(NA,200,80,NA,205,50,NA)
X2002 <- c(NA,300,NA,300,NA,NA,NA)
X2003 <- c(400,NA,70,NA,NA,NA,600)
X2004 <- c(NA,500,NA,NA,NA,NA,NA)
dat <- data.frame(id,X2000,X2001,X2002,X2003,X2004)

id X2000 X2001 X2002 X2003 X2004
A    NA    NA    NA   400    NA
B    NA   200   300    NA   500
C    NA    80    NA    70    NA
D    NA    NA   300    NA    NA
E   100   205    NA    NA    NA
F    NA    50    NA    NA    NA
G    NA    NA    NA   600    NA

Полученный кадр данных должен выглядеть следующим образом:

id X2000 X2001 X2002 X2003 X2004
A    NA    NA    NA   400   400
B    NA   200   300   300   500
C    NA    80    80    70    70
D    NA    NA   300   300   300
E   100   205   205   205   205
F    NA    50    50    50    50
G    NA    NA    NA   600   600

Есть ли какой-нибудь умный способ сделать это?Спасибо.

Ответы [ 2 ]

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

Мы могли бы apply с na.locf

library(zoo)
dat[-1] <- t(apply(dat[-1], 1, na.locf, na.rm = FALSE))
dat
#   id X2000 X2001 X2002 X2003 X2004
#1  A    NA    NA    NA   400   400
#2  B    NA   200   300   300   500
#3  C    NA    80    80    70    70
#4  D    NA    NA   300   300   300
#5  E   100   205   205   205   205
#6  F    NA    50    50    50    50
#7  G    NA    NA    NA   600   600
0 голосов
/ 21 ноября 2018

Вот один способ с dplyr и tidyr -

dat %>%
  gather(year, value, -id) %>% 
  group_by(id) %>% 
  arrange(id, year) %>% 
  fill(value, .direction = "down") %>% 
  ungroup() %>% 
  spread(year, value)

# A tibble: 7 x 6
  id    X2000 X2001 X2002 X2003 X2004
  <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A        NA  NA    NA   400   400  
2 B        NA 200   300   300   500  
3 C        NA  80.0  80.0  70.0  70.0
4 D        NA  NA   300   300   300  
5 E       100 205   205   205   205  
6 F        NA  50.0  50.0  50.0  50.0
7 G        NA  NA    NA   600   600 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...