用NA填充直到一个数字,之后用0填充

问题描述 投票:0回答:2

我需要在数字出现在时间表中之后将NA转换为0。这是一个示例:

c1<-c(1,NA,NA,NA,NA,1,2,NA,NA,NA,5,NA,NA)
c2<-c(2,NA,NA,10,30,NA,NA,NA,NA,4,1,2,NA)
c3<-c(3,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA)
x<-data.frame(rbind(c1,c2))
colnames(x)<-c("ID","Jan01","Feb01","Mar01","Apr01","May01","Jun01","Jul01","Aug01","Sep01","Oct01","Nov01","Dec01")

#x
#   ID Jan01 Feb01 Mar01 Apr01 May01 Jun01 Jul01 Aug01 Sep01 Oct01 Nov01 Dec01
#c1  1    NA    NA    NA    NA     1     2    NA    NA    NA     5    NA    NA
#c2  2    NA    NA    10    30    NA    NA    NA    NA     4     1     2    NA
#c3  3    NA    NA    NA    NA    NA    NA    NA    NA     1     NA   NA    NA

这就是我的期望:

c11<-c(1,NA,NA,NA,NA,1,2,0,0,0,5,0,0)
c22<-c(2,NA,NA,10,30,0,0,0,0,4,1,2,0)
c3<-c(3,NA,NA,NA,NA,NA,NA,NA,NA,1,0,0,0)
y<-data.frame(rbind(c11,c22))
colnames(y)<-c("ID","Jan01","Feb01","Mar01","Apr01","May01","Jun01","Jul01","Aug01","Sep01","Oct01","Nov01","Dec01")

#y
#    ID Jan01 Feb01 Mar01 Apr01 May01 Jun01 Jul01 Aug01 Sep01 Oct01 Nov01 Dec01
#c11  1    NA    NA    NA    NA     1     2     0     0     0     5     0     0
#c22  2    NA    NA    10    30     0     0     0     0     4     1     2     0
#c33  3    NA    NA    NA    NA    NA    NA    NA    NA     1     0     0     0

有人知道该怎么做?谢谢!

r na
2个回答
0
投票

A base选项:

t(apply(x[,-1], 1, function(x) ifelse(is.na(x) & cumsum(!is.na(x)) >= 1, 0, x)))

输出:

   Jan01 Feb01 Mar01 Apr01 May01 Jun01 Jul01 Aug01 Sep01 Oct01 Nov01 Dec01
c1    NA    NA    NA    NA     1     2     0     0     0     5     0     0
c2    NA    NA    10    30     0     0     0     0     4     1     2     0
c3    NA    NA    NA    NA    NA    NA    NA    NA     1     0     0     0

0
投票

替换了NA后,我将其转回到“宽”格式,以匹配所需的输出,但要注意的是,无论如何,最好以长格式存储此格式。

library(dplyr)
library(tidyr)

long <- 
  x %>% 
    pivot_longer(-ID) %>% 
    group_by(ID) %>% 
    mutate(value = ifelse(cumsum(!is.na(value)), nafill(value, fill = 0), value))

long %>% 
  pivot_wider(ID, name)


# # A tibble: 3 x 13
# # Groups:   ID [3]
#      ID Jan01 Feb01 Mar01 Apr01 May01 Jun01 Jul01 Aug01 Sep01 Oct01 Nov01
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1     1    NA    NA    NA    NA     1     2     0     0     0     5     0
# 2     2    NA    NA    10    30     0     0     0     0     4     1     2
# 3     3    NA    NA    NA    NA    NA    NA    NA    NA     1     0     0
# # ... with 1 more variable: Dec01 <dbl>
© www.soinside.com 2019 - 2024. All rights reserved.