我是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)在最终产品中,所有日期都变为其内部数字形式。从那里开始,我正在努力让它们恢复原状。
感谢您的帮助
答案 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)
NA
&#39; s whereToAdd <- is.na(HMRoo2_Allo_M4$traitm.stop)
NA
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")