我有一个像这样的数据框
XX
dput(head(xx,10))
structure(list(JobName = c("EXBCV01D", "EXBCV01D", "EXBCV01D",
"EXBCV01D", "EXBCV01D", "EXBCV01D", "EXBCV01D", "EXBCV01D", "EXBCV01D",
"EXBCV01D"), Date = c(120820L, 120817L, 120816L, 120815L, 120814L,
120813L, 120810L, 120809L, 120808L, 120807L), TargetDate = c(NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_)), .Names = c("JobName",
"Date", "TargetDate"), row.names = c(NA, 10L), class = "data.frame")
我需要抓住目标不是
的所有行我这样做 xxx< -with(xx,xx [!is.na(TargetDate),])
我明白了:
head(xxx)
JobName Date TargetDate
2689 EXBCV06D 120820 -1
2690 EXBCV06D 120820 -1
2691 EXBCV06D 120820 -1
2692 EXBCV06D 120820 -1
2693 EXBCV06D 120817 -1
2694 EXBCV06D 120817 -1
我在同一天收到多个JobName。这里发生了一些奇怪的事情。
答案 0 :(得分:0)
它应该是 is.na(....)
而不是is.NA(....)
,在函数名称中na
是小写的。
例如使用您的数据
x <- read.table(text = "Date Process Target
1/1/2012 ftp -2
1/2/2012 http -1
1/3/2012 telnet NA
1/4/2012 ssh NA", header = TRUE, na.strings="NA")
x <- transform(x, Target = factor(Target))
这是有效的
R> xx <- subset(x, !is.na(Target))
R> xx
Date Process Target
1 1/1/2012 ftp -2
2 1/2/2012 http -1
您也可以通过常用的子集例程来执行此操作:
R> with(x, x[!is.na(Target), ])
Date Process Target
1 1/1/2012 ftp -2
2 1/2/2012 http -1
或
R> x[!is.na(x$Target), ]
Date Process Target
1 1/1/2012 ftp -2
2 1/2/2012 http -1
答案 1 :(得分:0)
此外,您可能会发现complete.cases
方便。您可以使用此函数删除任何列中NA
s的所有行。
d <- read.table(text="Date Process Target
1/1/2012 ftp -2
1/2/2012 http -1
1/3/2012 telnet NA
1/4/2012 ssh NA", header=TRUE)
d[complete.cases(d), ]
# Date Process Target
# 1 1/1/2012 ftp -2
# 2 1/2/2012 http -1
我只想补充一点,建议您仅在交互模式下使用subset
函数,而不是在脚本中以编程方式使用。由于此函数的评估方式,可能会出现问题(请参阅discussion)。如果你只是测试一下,感觉很舒服。但是,如果您正在编写可能被其他人使用的函数,那么在安全方面是错误的,并使用@ Gavin和我的答案中演示的标准[
子集化语法。