我需要在数字出现在时间表中之后将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
有人知道该怎么做?谢谢!
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
替换了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>