【问题标题】:R subsetting a data frame with conditionsals on date values where some fields have no dateR在某些字段没有日期的日期值上使用条件对数据框进行子集化
【发布时间】:2015-03-23 17:18:26
【问题描述】:

我有一个数据框:

'data.frame':   2611029 obs. of  10 variables:
 $ eid              : int  28 28 28 28 28 36 36 36 36 37 ...
 $ created          : Factor w/ 36204 levels "0000-00-00 00:00:00",..: NA NA NA NA NA NA NA NA NA NA ...
 $ class_id         : int  NA NA NA NA NA NA NA NA NA NA ...
 $ min.e.event_time.: Factor w/ 16175 levels "2013-04-15 11:17:19",..: NA NA NA NA NA NA NA NA NA NA ...
 $ lead_date        : Factor w/ 11199 levels "2012-10-11 18:39:12",..: NA NA NA NA NA NA NA NA NA NA ...
 $ camp             : int  44698 44698 44699 44701 44701 44715 44715 44909 44909 44699 ...
 $ event_date       : Factor w/ 695747 levels "2008-01-18 12:18:01",..: 1 5 2 32 36 6 17039 23 24 2 ...
 $ event            : Factor w/ 3 levels "click","open",..: 3 2 3 3 2 3 2 3 2 3 ...
 $ message_name     : Factor w/ 2707 levels ""," 2015-03 CAD Promotion Update",..: 2163 2163 2163 1106 1106 2163 2163 1990 1990 2163 ...
 $ subject_lin      : Factor w/ 2043 levels ""," Christie Office Holiday Hours",..: 613 613 613 248 248 613 613 612 612 613 ...

每个订单项都是一个用户 (eid) 已收到电子邮件 (event_date) 的实例。

event_date、lead_date 和 created 都是日期。到现在为止,我已经使用 as.Date() 在对数据进行子集化之后转换了这些日期,因此只有这些日期的 complete.cases() 记录。这使我可以进行基于聚合和子集的条件,例如其中 event_date

如果我尝试按原样转换数据中的日期,而不删除 na 值,我会收到消息

Error in charToDate(x) : 
  character string is not in a standard unambiguous format

分析的目的是查看接收电子邮件对成为潜在客户的影响(因此将填充lead_date,否则为NA)。因此,我不想通过在完整的潜在客户日期对整个 df 进行子集化来排除从未成为潜在客户的人。

但我仍然想对那些带有日期的记录进行计算,将 NA 作为自己的组。

有什么我可以在这里做的吗?我希望 R 在使用子集或聚合等函数时忽略 NA 结果。我还想使用 as.Date() 将所有非 NA 日期转换为日期

** 发布后** 我可能可以用更简单的方式问这个问题:我可以将数据框中的字段转换为可行的日期,否则忽略 na 值吗?

【问题讨论】:

  • 你好@akrun。我现在正在查看它,并且在 ?as.Date。我很难理解如何处理 R 文档,并且发现我很少知道下一步该做什么。事实上,每当我阅读 R 文档时,我通常会比打开它之前更加困惑。有没有我可以传入 as.Date() 的参数,上面写着“忽略 NAs”?
  • 我不确定这是否与NA 有关。否则,v1 <- c('2008-01-01', '2009-05-02', NA); as.Date(v1) #[1] "2008-01-01" "2009-05-02" NA 应该显示错误。但是,这确实需要 NA 并为那些 NA 的元素提供 NA
  • 另外,正如我之前提到的,最好使用dput 显示几行数据。
  • 您的因子水平之一是“0000-00-00 00:00:00”。当我尝试使用 as.Date.factor 时,该值会导致您看到的错误。试试as.Date(factor("0000-00-00 00:00:00"))。您可能需要先将这些项目设置为 NA。没有年份 == 0000。(可以说这应该是自动发生的,但如果您确实向 NA 提供格式字符串强制转换确实会发生。)

标签: r date subset


【解决方案1】:

as.Date( , format="%Y-%m-%d")替换所有as.Date( )调用

> as.Date(factor("0000-00-00 00:00:00"))
Error in charToDate(x) : 
  character string is not in a standard unambiguous format
> as.Date(factor("0000-00-00 00:00:00"), format="%Y-%m-%d")
[1] NA

然后描述您在更新数据集时遇到的问题(代码和错误)。无法从描述中预测您在接下来的步骤中遇到的问题。有一个is.na 函数可以与其他逻辑测试结合使用。

请记住is.na(NA) | NA 将返回 TRUE。这不适用于& (AND),但适用于 OR。

【讨论】:

  • 感谢您的回答。我将 , format="%Y-%m-%d" 参数添加到我的 as.Date() 函数中,并且所有“工作”,因为我没有收到任何错误。但看起来 R 的行为方式是,当我基于此子集时,它会从数据框中删除 NA 记录,而不是将它们视为自己的组,这是我所希望的。
  • 如我所说,你需要使用is.na:subset(df, is.na(dt) | dt >as.Date("2001-01-01"))#R OR 符号为|
猜你喜欢
  • 2020-10-17
  • 2021-02-01
  • 2019-12-28
  • 1970-01-01
  • 2015-02-11
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多