0

我有一个这样的数据框

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。这里发生了一些奇怪的事情。

4

2 回答 2

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
于 2012-11-14T19:01:30.087 回答
0

此外,您可能会觉得complete.cases很方便。您可以使用此函数删除任何列中带有NAs 的任何行。

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在交互模式下使用该功能,而不是在您的脚本中以编程方式使用。由于此函数的评估方式,可能会出现问题(参见讨论)。如果您只是在测试一些东西,请放心使用它。但是,如果您正在编写可能被其他人使用的函数,请在安全方面犯错,并使用[@Gavin 和我的答案中演示的标准子集语法。

于 2012-11-14T19:05:50.177 回答