0

我有一个包含很多日期的数据框(数据)。我想删除 1970 年之前的所有内容。我可以创建一个 1970 年之前的索引列表:

tmp <- which(data$data < '1970-01-01')
[1]  13446 102876 141199

我想创建一个删除这三行的新表。就像是:

data.after.1970 <- data[!tmp, ]

我知道我可以创建一个包含1970 年之后所有事件的向量,并与它匹配:

tmp <- which(data$data > '1970-01-01')
data.after.1970 <- data[tmp, ]

但我想知道我会使用什么语法来排除项目​​。

更新

我终于做到了:

tmp <- which(data$data > as.Date('1970-01-01'))
data.after.1970 <- data[tmp, ]

并仔细看了看。which(data$data < as.Date('1970-01-01'))得到三个结果,但nrow(data) - nrow(data.after.1970)显示我删除了 45 行。summary(datae$date)清除了:

summary(data$date)
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max.         NA's 
"1933-07-01" "1989-01-25" "1992-07-09" "1992-05-03" "1996-06-10" "2006-09-14"         "42" 

因为我的目标是获得第二个数据集,所以如果我排除那些日期不好的数据集,我可以比较我的结果,我实际上也想删除那些具有 NA 值的数据集。

仍然想知道我会使用什么语法来排除一些数字向量而不是包含它。

4

3 回答 3

5

which返回在逻辑表达式的评估中或在逻辑向量本身中为 TRUE 的项的数值向量。也可以使用负索引来删除项目。在您的情况下,可能看起来像:

tmp <- data[ which(data$data < '1970-01-01') ,  ] 

即返回数据帧的所有行,“数据”列小于“1970-01-01”的“数据”。你真的应该学会使用比“数据”更具体的名称。您不仅会因为对象和与该对象的元素具有相同名称而造成混淆,而且还有一个函数“数据”。那么你的可怜的听众应该如何知道你在 10 个月前编写代码时的意思。

为了解决上面那些不喜欢使用的反对者,which我会回答它避免了“[”函数将返回条件为 TRUE 或为 NA 的所有行的问题。您可以使用subsetwhich 具有相同的优势,但不建议在编程中使用,仅用于交互使用。您可以按照子集的方式进行操作,并添加一个消除 NA 值的子句:

tmp <- data[ data$data < '1970-01-01 & !is.na(data$data) , ]

...而且我认为使用的版本which比那个替代版本“更干净”。在没有值为 TRUE 并且您使用负索引的情况下会出现一个缺点which,在这种情况下,与预期相反,使用dfrm[-which(condition) , ]不会给您想要的东西,而是一个空向量。所以规则是:使用which但不使用负索引。

于 2012-11-29T23:49:25.490 回答
1

多解释一点,如果你运行:

data$date > '1970-01-01'

您将看到它返回一个逻辑向量TRUE/FALSE,您可以使用该向量来选择所需的行。它在这个例子中工作:

test <- 1:3
test[c(TRUE,FALSE,TRUE)]
# result
[1] 1 3

正如@DWin 在他的回答中指出的那样,当您有NA值时,有一些警告,这些值也将与TRUE值一起返回。如:

test <- c(NA,1:3)
test > 2
# result
[1]    NA FALSE FALSE  TRUE
test[test>2]
# result
[1] NA  3

which语句TRUE仅返回所有索引,从而避免了NA值的问题。

test <- c(NA,1:3)

which(test>2)
# result - the fourth value of test is > 2
[1] 4

> test[4]
# result - return the fourth value of test
[1] 3

test[which(test>2)]
# result - return the fourth value of test as the 
# which statement has identified it is > 2
[1] 3

顺便说一句,我正在收集您可能实际上需要执行以下操作:

data$date > as.Date('1970-01-01')

...让您的示例正常工作。这当然是假设您的date列实际上也是一个Date对象,而不仅仅是纯文本。

于 2012-11-29T23:52:57.097 回答
0

事实证明它实际上非常简单。

data.after.1970 <- data[-tmp, ]

将创建一个新框架,data.after.1970其中包括data除与 中的索引匹配的 行之外的所有行tmp

于 2012-12-01T20:11:01.953 回答