【发布时间】: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 或其他地方找到)。如果您坚持使用基础,format和as.integer可以从日期中提取。