在某些值的右侧填充行值

时间:2018-11-20 22:46:18

标签: r

鉴于以下数据框,我需要能够在右侧的每一行中填充值,直到遇到下一个值为止,在这种情况下,我需要将该值填充出来,依此类推,直到到达行尾为止。

# 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 :(得分:1)

这是dplyrtidyr的一种方式-

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 

答案 1 :(得分:1)

我们可以applyna.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