[英]Replace values with NA where date is greater then… with R
我試圖創建精確的樣本數據,但是失敗了,這是嘗試:
data1 <- data.frame(date=as.Date(as.character(c("01-03-2015","01-04-2015","01-05-2015")),"%d-%m-%Y"), Val=rnorm(3,1,1))
data2 <- data.frame(date=c(NA,"",NA), Val=rnorm(3,1,1))
data3 <- data.frame(date=as.Date(as.character(c("01-09-2015","01-10-2015","01-11-2015")),"%d-%m-%Y"), Val=rnorm(3,1,1))
do.call(cbind, list(data1,data2,data3))
樣本數據應如下所示(我試圖與rbind
綁定,但由於未知原因,它對我來說失敗)。
date Val
1 2015-03-01 -0.8496063
2 2015-04-01 1.5014609
3 2015-05-01 0.7923492
4 <NA> 1.6646475
5 1.1976965 # empty string in column date
6 <NA> 0.9105403 # NA in column date
7 2015-09-01 0.6214811
8 2015-10-01 1.1314259
我想做的是用NA
替換Val列的所有值,在date列中,日期大於2015-09-01
這不完全是我擁有的示例數據(無論是空字符串還是NA,這些屬性都必須保持不變)。
Sampdata <- data.frame(date=c(as.Date(as.character(c("01-03-2015","01-04-2015","01-05-2015")),"%d-%m-%Y"),"NA","NA","NA",
as.Date(as.character(c("01-08-2015","01-09-2015")),"%d-%m-%Y")), Val=rnorm(8,1,1))
Sampdata$Val <- ifelse(Sampdata$date>=(as.Date(as.character("2015-09-01"))),NA,Sampdata$Val)
上面的解決方案失敗了,因為它也用NA替換了那些列日期包含NA和空字符串的行。
所需解決方案:
date Val
1 2015-03-01 -0.8496063
2 2015-04-01 1.5014609
3 2015-05-01 0.7923492
4 <NA> 1.6646475
5 1.1976965
6 <NA> 0.9105403
7 2015-09-01 NA
8 2015-10-01 NA
編輯:
因此,讓我們將采樣日期更正為:(無空字符串)
Sampdata <- data.frame(date=c(as.Date(as.character(c("01-03-2015","01-04-2015","01-05-2015")),"%d-%m-%Y"),"NA","NA","NA",
as.Date(as.character(c("01-08-2015","01-09-2015")),"%d-%m-%Y")), Val=rnorm(8,1,1))
建議的解決方案:
indx <- as.Date(Sampdata$date) >= '2015-09-01'
Sampdata$Val[indx & !is.na(indx)] <- NA
Sampdata
在我的電腦上給出以下內容:
date Val
1 2015-03-01 1.4437853
2 2015-04-01 -0.1695267
3 2015-05-01 0.5083815
4 <NA> NA
5 <NA> NA
6 <NA> NA
7 2015-08-01 0.3026487
8 2015-09-01 NA
您可以將akrun的兩個步驟合並為一行
df$Val[df$date >= '2015-09-01'] <- NA
你可以試試
indx <- as.Date(df$date) >= '2015-09-01'
df$Val[indx & !is.na(indx)] <- NA
df
# date Val
#1 2015-03-01 -0.8496063
#2 2015-04-01 1.5014609
#3 2015-05-01 0.7923492
#4 <NA> 1.6646475
#5 1.1976965
#6 <NA> 0.9105403
#7 2015-09-01 NA
#8 2015-10-01 NA
我將使用真實的NA
而不是"NA"
創建Sampdata
Sampdata <- data.frame(date=c(as.Date(as.character(c("01-03-2015",
"01-04-2015","01-05-2015")),"%d-%m-%Y"),NA,NA,NA,
as.Date(as.character(c("01-08-2015",
"01-09-2015")), "%d-%m-%Y")), Val=rnorm(8,1,1))
indx <-Sampdata$date >='2015-09-01'
Sampdata$Val[indx & !is.na(indx)] <- NA
df <- structure(list(date = c("2015-03-01", "2015-04-01", "2015-05-01",
"<NA>", "", "<NA>", "2015-09-01", "2015-10-01"), Val = c(-0.8496063,
1.5014609, 0.7923492, 1.6646475, 1.1976965, 0.9105403, 0.6214811,
1.1314259)), .Names = c("date", "Val"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8"))
另一種方法:
is.na(Sampdata$Val) <- Sampdata$date >= '2015-09-01'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.