R - 将NA转换为日期列中的特定日期

时间:2016-11-02 18:30:54

标签: r date

我是R的新手,我有这个数据框,其中一个列有日期。它代表结束日期,所以每当没有结束时,就会有NA,这意味着“正在进行”#34;。让我们说我正在考虑将我的数据锁定为2016-11-01,然后我希望这些NAs变成" 2016-11-01"。我想要一个日期而不是NA的原因是因为我想计算出这些数据,并且NAs在我的最终结果中引入了偏差。我尽我所能,并根据那些阅读失败的多次尝试。我确信这是我目前视而不见的一些基本内容。

dput是:

structure(list(traitm.start = structure(c(14039, 12410, 14495, 
14378, 13238, 13859, 14732, 12762, 13853, 12675, 12784, 16465, 
13958, 14155, 14123, 13860, 13055, 12809, 14822, 14816, 12476, 
13081, 14183, 12475, 14560, 15026, 15006, 16514, 13993, 13963, 
13257, 14173, 13013, 15435, 14463, 14999, 13480, 13915, 14536, 
14904, 16865, 16436), class = "Date"), traitm.stop = structure(c(15908, 
13633, 16733, 15078, NA, 14473, 15719, 12802, 14236, 12695, 16988, 
NA, 14030, 15587, 15083, NA, 13584, 13634, NA, 15084, 12869, 
15772, 16071, 12481, 16534, 15400, NA, 16863, 14781, 15198, 13390, 
14963, 14426, 16988, 16289, 15405, NA, 14728, 15980, 15155, NA, 
16841), class = "Date"), IS.rlp = c("1", "0", "0", "1", "1", 
"1", "1", "1", "1", "0", "0", "1", "1", "0", "0", "1", "0", "1", 
"0", "1", "1", "0", "0", "1", "1", "1", "0", "1", "0", "1", "1", 
"0", "1", "0", "0", "1", "0", "1", "1", "0", "1", "0"), treat.lenght = structure(c(62, 
41, 75, 23, NA, 20, 33, 1, 13, 1, 140, NA, 2, 48, 32, NA, 18, 
28, NA, 9, 13, 90, 63, 0, 66, 12, NA, 12, 26, 41, 4, 26, 47, 
52, 61, 14, NA, 27, 48, 8, NA, 14), class = "difftime", units = "days")), .Names = c("traitm.start", 
"traitm.stop", "IS.rlp", "treat.lenght"), row.names = c(1L, 2L, 
3L, 4L, 5L, 6L, 8L, 9L, 10L, 11L, 13L, 14L, 15L, 16L, 17L, 18L, 
20L, 21L, 22L, 23L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 
34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 43L, 44L, 45L, 46L, 47L
), class = "data.frame")

这就是我被困的地方,有两个问题:

使用dplyr:

HMRoo2_Allo_M4 <- HMRoo2_Allo_M4%>%mutate(traitm.stop=
     ifelse(is.na(HMRoo2_Allo_M4$traitm.stop) ==TRUE,
     2016-11-01,HMRoo2_Allo_M4$traitm.stop))

1)如何告诉R 2016-11-01必须是约会? 2)在最终产品中,所有日期都变为其内部数字形式。从那里开始,我正在努力让它们恢复原状。

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

使用data.table让它看起来很简单。首先,基本设置:

install.packages("data.table") #optional, run if you don't have data.table package
library(data.table)

您需要的操作:

setDT(df)   #turn into data.table
df[is.na(traitm.stop), traitm.stop := as.Date('2016-11-01')]
setDF(df)  #optional, turn back to Data.frame

注意:

  

data.table公式是DT [I,J,by] - 我是子集或连接,J是要执行的操作,by是分组元素。在我们的例子中,我是is.na上的traitm.stop函数。它返回一个与data.table长度相同的布尔值,允许您有效地进行子集化。 J是traitm.stop上的操作,其中:=是data.tables的特殊赋值运算符。 as.Date告诉R字符串2016-11-01是日期。没有by,因为我们正在处理完整的数据集。

     

SetDT是一个就地(无副本)运算符,可将data.frame转换为data.table。 SetDF将data.table转换回data.frame,因为大多数不熟悉data.table的用户都会在使用其语法时遇到问题。

结果:

   traitm.start traitm.stop IS.rlp treat.lenght
 1:   2008-06-09  2013-07-22      1      62 days
 2:   2003-12-24  2007-04-30      0      41 days
 3:   2009-09-08  2015-10-25      0      75 days
 4:   2009-05-14  2011-04-14      1      23 days
 5:   2006-03-31  2016-11-01      1      NA days
 6:   2007-12-12  2009-08-17      1      20 days
 7:   2010-05-03  2013-01-14      1      33 days
 ...

PS:计算之间的正确月份:

library(mondate)
df[, treat.length := MonthsBetween(mondate(traitm.stop),  mondate(traitm.start))]

答案 1 :(得分:0)

那个代码块很乱,所以我不打算读它。这就是你如何将整个列设置为日期。设df为data.frame,date为日期列。

df$date = as.Date(as.character(df$date),"%Y-%m-%d)

这是将NA条目设置为特定日期的方法。假设您要转换为12/31/9999。用你想要的任何日期交换它。

df$date[is.na(df$date)] = as.Date("12-31-9999","%m-%d-%Y)

答案 2 :(得分:0)

  1. 确定NA&#39; s
  2. whereToAdd <- is.na(HMRoo2_Allo_M4$traitm.stop)

    1. 插入NA
    2. 的列

      HMRoo2_Allo_M4$traitm.stop[whereToAdd] <- as.Date("2016-11-01")

      或者全部在一个

      HMRo2_Alo_M4[is.na(HMRo2_Alo_M4$traitm.stop), ] <- as.Date("2016-11-01")