5

我有一个数据框,我已经为其计算并添加了一difftime列:

    name   amount   1st_date   2nd_date  days_out
    JEAN  318.5 1971-02-16 1972-11-27  650 days
 GREGORY 1518.5       <NA>       <NA>   NA days
    JOHN  318.5       <NA>       <NA>   NA days
  EDWARD  318.5       <NA>       <NA>   NA days
  WALTER  518.5 1971-07-06 1975-03-14 1347 days
   BARRY 1518.5 1971-11-09 1972-02-09   92 days
   LARRY  518.5 1971-09-08 1972-02-09  154 days
   HARRY  318.5 1971-09-16 1972-02-09  146 days
   GARRY 1018.5 1971-10-26 1972-02-09  106 days

我想将其分解并计算 days_out 为 0-60、61-90、91-120、121-180 的小计。

出于某种原因,我什至不能可靠地编写括号表示法。我希望

members[members$days_out<=120, ] 只显示 Barry 和 Garry,但我得到了很多行,例如:

NA.1095     <NA>     NA       <NA>       <NA>  NA days
NA.1096     <NA>     NA       <NA>       <NA>  NA days
NA.1097     <NA>     NA       <NA>       <NA>  NA days

这些在原始数据中不存在。没有人是没有名字的。我在这里做错了什么?

4

2 回答 2

4

这是<和其他关系运算符的标准行为:当被要求评估是否NA小于(或大于,或等于,或...)某个其他数字时,它们返回NA,而不是TRUEor FALSE

这是一个示例,应该清楚正在发生的事情并指出一个简单的修复方法。

x <- c(1, 2, NA, 4, 5)
x[x < 3]
# [1]  1  2 NA
x[x < 3 & !is.na(x)]
# [1] 1 2

要查看为什么所有由NA's 索引的行都具有 row.names 之类NA.1095的 ,NA.1096等,请尝试以下操作:

data.frame(a=1:2, b=1:2)[rep(NA, 5),]
#       a  b
# NA   NA NA
# NA.1 NA NA
# NA.2 NA NA
# NA.3 NA NA
# NA.4 NA NA
于 2012-12-14T22:07:29.203 回答
4

如果您在控制台上工作,则该subset功能没有那个烦人的“功能”,这实际上是由于关系运算符的行为而[不是关系运算符。

subset(members, days_out <= 120)

如果您正在编程,那么您可以在“幕后”使用which或 Josh 的结合& is.na(.)which

members[ which(members$days_out <= 120), ]
于 2012-12-14T22:52:19.723 回答