我有一个数据框,我已计算并添加了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时进行小计。
由于某种原因,我甚至无法可靠地编写括号表示法。我希望
成员[成员$ days_out&lt; = 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
原始数据中不存在。没有人没有名字。我在这里做错了什么?
答案 0 :(得分:4)
这是<
和其他关系运算符的标准行为:当被要求评估NA
是否小于(或大于,或等于或......)某些其他数字时,返回NA
,而不是TRUE
或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
索引的所有行都包含NA.1095
,NA.1096
之类的row.names,请尝试以下操作:
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
答案 1 :(得分:3)
如果你在控制台工作,subset
函数没有那个烦人的'功能',这实际上是由于[
的行为而不是关系运营商的行为。
subset(members, days_out <= 120)
如果您正在编程,那么您可以使用which
或Josh与& is.na(.)
which
在“场景”后面所做的一起使用:
members[ which(members$days_out <= 120), ]