簡體   English   中英

用日期大於...的NA替換值,用R替換…

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM