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的一般性评论?
我不喜欢在设计"["处理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)
在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.table和DF手段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,]