我有一个像这样的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的任何一般性评论都受到欢迎?
答案 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.table
和data.frame
之间的差异列表位于常见问题解答2.17 here中。
如果您认为所有这些差异都会破坏兼容性,那么它们就不会。您仍然可以将data.table
传递给任何软件包,当这些软件包在data.table
上使用标准R语法时,它仍然有效。
由于您说大 data.frame
,data.table
无论如何都值得一看。
这些是FAQ 2.17中的3分(其中DT
表示data.table
而DF
表示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的美妙之处在于它通常会传播,在你的分析结束时告诉你,在那里的某个地方,你有一些缺失,你最好去思考。没有什么可以替代思考缺失。