【问题标题】:Why dplyr::filter() includes data for which condition is False?为什么 dplyr::filter() 包含条件为 False 的数据?
【发布时间】:2017-07-26 12:51:51
【问题描述】:

这是我很难理解的事情。想象一下,我有一个包含 2 列的数据框:

**Year**      **Date**
1925          1925-01-02
1941          1925-02-03
1990          1990-01-02
1956          NA
1990          1990-01-02
2002          2004-01-02

我正在尝试过滤掉所有那些**Year** 列中的值与**Date** 列中的年份不匹配的条目。

所以,我为 Date 列编写了一个小型解析器,假设数据集更大:

dateParser <- function(date) {
  dateStr <- toString(date)
  yearStr <- strsplit(dateStr, "-")[[1]][1]
  yearInt <- as.integer(yearStr)

  return(yearInt)
}

随后我使用dplyr::filter() 过滤掉这些事件:

noMismatch <- dplyr::filter(data, as.integer(data$Year) == dateParser(data$Date))

但我仍然在生成的数据框中看到一些年份不匹配的行。为什么?

附:假设我不关心**Date** 列中的NA 值,并且每当出现NA 时,我只是将这一行留在里面。

【问题讨论】:

  • 您提供的数据样本是否出现错误?年级是什么年级?我会使用lubridate::year()
  • 看看strsplit(dateStr, "-")[[1]][1]——这只是一个元素,从第一行开始。使用它而不是覆盖所有行的向量,很自然会得到奇怪的结果。
  • @Frank,我觉得您可能有一点,您能否详细说明矢量化解决方案的外观?我想我仍然无法适应 R 的矢量化特性。
  • 这取决于你想使用的工具,我想。使用data.table,有tstrsplit;使用 stringr 或 stringi,可能还有另一种方式;最好的方法可能是 Richard 建议的 - 存储为 Date 对象并使用 year() 提取器(在 data.table、lubridate 或其他地方找到)。如果您坚持使用基础,formatas.integer 可以从日期中提取。

标签: r filter dplyr


【解决方案1】:

这可能与您的

dateParser(data$Date)

不会返回您正在寻找的数据格式。

试试:

library(lubridate)
library(dplyr)
noMismatch <- filter(data, as.integer(data$Year) == year(data$Date))

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2023-01-27
    相关资源
    最近更新 更多