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

时间:2012-03-02 17:14:42

标签: r dataframe transformation

我有一个像这样的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

R具有NA值很好但有时它会咬我。我经常忘记它并尝试像这样进行子集化

> t[t$count>=1,]
[1] NA  2 NA NA NA  8 NA NA NA

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

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

> t[t$count>=1&!is.na(t$count),]
[1] 2 8

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

  

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

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

2。 或者我将如何运行

transform(t, replace all NAs from count columns with 0)

甚至更好

transform(t, replace all NA from all numeric columns with 0 in t)

3。 关于让R忘记NAs的任何一般性评论都受到欢迎?

3 个答案:

答案 0 :(得分: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

我也使用subset,因为它以与which(logical)相同的方式处理NA。一个问题是当which与“ - ”符号一起使用以检索补语集时。如果集合中没有满足逻辑条件的元素,则-which(logical) - 形式中也不会有元素。所以我只是不使用-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)

答案 1 :(得分:5)

data.table中,它可以按照您的喜好运行到w.r.t. NA,如果我理解正确的话。此外,您不需要使用$,也不介意忘记逗号。

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

data.tabledata.frame之间的差异列表位于常见问题解答2.17 here中。

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

由于您说 data.framedata.table无论如何都值得一看。

这些是FAQ 2.17中的3分(其中DT表示data.tableDF表示data.frame):

  • DT[NA]返回1行NA,但DF[NA]会返回整个DF的副本 始终包含NA。符号NA在R中是逻辑类型,并且是 因此由[.data.frame回收。意图可能是 DF[NA_integer_][.data.table会自动执行此操作 便利性。

  • DT[c(TRUE,NA,FALSE)]NA视为FALSE,但是 DF[c(TRUE,NA,FALSE),]为每个NA

  • 返回NA
  • DT[ColA==ColB]是 比DF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]

  • 简单

答案 2 :(得分:3)

很容易在列表上做(2)(替换所有的NA):

t$count[is.na(t$count)] <- something.else

问题是,当然,你为something.else投入了什么。存在用于解决问题的NA。如果你想要禁止他们使用R,你需要弄清楚除了将缺失的观察结果丢失之外你想做什么。

NA的美妙之处在于它通常会传播,在你的分析结束时告诉你,在那里的某个地方,你有一些缺失,你最好去思考。没有什么可以替代思考缺失。