键入NA值时,子集化数据帧不起作用

时间:2012-11-14 18:57:25

标签: r

我有一个像这样的数据框

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

2 个答案:

答案 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和我的答案中演示的标准[子集化语法。