在R中,有没有办法在data.frame的整数列中处理NA,以便在子集化时不包括NA值?

use*_*rJT 5 r transformation dataframe

我有一个像这样的data.frame:

(t=structure(list(count = c(NA, 2, NA, NA, NA, 8, NA, NA, NA)), .Names = "count", row.names = c(NA,-9L), class = "data.frame"))
  count
1    NA
2     2
3    NA
4    NA
5    NA
6     8
7    NA
8    NA
9    NA
Run Code Online (Sandbox Code Playgroud)

R具有NA值很好但有时它会咬我.我经常忘记它,并尝试像这样做子集

> t[t$count>=1,]
[1] NA  2 NA NA NA  8 NA NA NA
Run Code Online (Sandbox Code Playgroud)

输出包括所有NA行.(我不喜欢)

经过一个小时的错误搜索后,我将代码更改为此,这就是我想要的(想象大数据帧有很多非NA结果,只有少数"隐藏得很好"的NA):

> t[t$count>=1&!is.na(t$count),]
[1] 2 8
Run Code Online (Sandbox Code Playgroud)

1.是否有"as.integer"功能的功能,以便我可以这样做:

T [as.integer.EXCLUDE.NA(T $计数)> = 1,]

我想在其他as.xxxx函数中使用这样的功能.基本上强制R停止像统计学家一样思考并且不同地对待NA(例如,像NULL(我不确定NULL会解决我的问题)(这不起作用:t $ count [3] < - 由于某种原因为NULL)

2.或者我将如何运行

transform(t, replace all NAs from count columns with 0)
Run Code Online (Sandbox Code Playgroud)

甚至更好

transform(t, replace all NA from all numeric columns with 0 in t)
Run Code Online (Sandbox Code Playgroud)

3.欢迎任何关于让R忘记NAs的一般性评论?

42-*_*42- 6

我不喜欢在设计"["处理NA值时所做的选择.当我想使用逻辑测试提取值时,我采用的方法是将逻辑表达式包装在其中which.这会将结果转换为一组数字,并且索引成功,而不会拖动不需要的NA:

> t[ which(t$count >= 1), ]
[1] 2 8
# Or if you still want a dataframe result
> t[ which(t$count >= 1), , drop=FALSE]
  count
2     2
6     8
Run Code Online (Sandbox Code Playgroud)

我也使用,subset因为它以与处理NA相同的方式处理NA which(logical).一个问题是当which使用" - "符号来检索补集时.如果集合中没有满足逻辑条件的元素,则-which(logical)-form中也不会有元素.所以我只是不使用-which组合:

> t[ -which(t$count < 1), , drop=FALSE]
[1] count
<0 rows> (or 0-length row.names)
> t[ which(t$count < 1), , drop=FALSE]
[1] count
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)


Mat*_*wle 5

data.table它的工作原理,你想它WRT NA,如果我理解正确.此外,您不需要使用$它也不介意忘记逗号.

dt = as.data.table(t)
t[count>=1]   # NA's are treated as FALSE
Run Code Online (Sandbox Code Playgroud)

之间的差异的列表data.table,并data.frame在FAQ 2.17 这里.

如果你认为所有这些差异都会破坏兼容性,那么它们就不会.您仍然可以传递data.table给任何包,当这些包使用标准R语法时data.table,它仍然有效.

既然你说 data.frame,data.table反正可能值得一看.

这些是FAQ 2.17(DT手段data.tableDF手段data.frame)中的3点:

  • DT[NA]返回1行NA,但DF[NA]返回整个DF 包含的NA整个副本.该符号NA在R中是逻辑类型,因此被回收[.data.frame.意图可能是 DF[NA_integer_].[.data.table这样做是为了方便起见.

  • DT[c(TRUE,NA,FALSE)]对待NAas FALSE,但 每个都DF[c(TRUE,NA,FALSE),]返回NA一行NA

  • DT[ColA==ColB] 比...更简单 DF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]