Replace Inf in R data.table / Show number of Inf in colums

点点圈 提交于 2019-12-11 04:09:06

问题


I can't figure out how to use an is.na(x) like function for infinite numbers in R with a data table or show per column how many Inf's there are: colSums(is.infinite(x))

I use the following example data set:

DT <- data.table(a=c(1/0,1,2/0),b=c("a","b","c"),c=c(1/0,5,NA))
DT
     a b   c
1: Inf a Inf
2:   1 b   5
3: Inf c   NA
colSums(is.na(DT))
a b c 
0 0 1 
colSums(is.infinite(DT))
Error in is.infinite(DT) : default method not implemented for type 'list'
DT[is.na(DT)] <- 100
 DT
     a b   c
1: Inf a Inf
2:   1 b   5
3: Inf c 100

DT[is.infinite(DT)] <- 100
Error in is.infinite(DT) : default method not implemented for type 'list'

I found in this post how to replace Inf with NA, but I would say there should be nicer way of achieving this, with is.infinite for example. And I would like to see the Inf's per column, any ideas about this?

Many thanks. BR Tim


回答1:


is.finite and is.infinite don't have a data.frame or a data.table methods like is.na has (compare methods(is.infinite) vs methods(is.na))

You could alternatively loop thru the columns and then use colSums

DT[, colSums(sapply(.SD, is.infinite))]
# a b c 
# 2 0 1 

Alternatively, you could use Reduce instead of colSums

DT[, Reduce(`+`, lapply(.SD, is.infinite))]
## [1] 2 0 1

Another option is to create your own custom function and then just loop it over the columns

Myfunc <- function(x) sum(is.infinite(x))
DT[, lapply(.SD, Myfunc)]
#    a b c
# 1: 2 0 1

Of course you could also write data.frame method for is.infinite as it appears to be generic (see ?is.infinite).



来源:https://stackoverflow.com/questions/30353894/replace-inf-in-r-data-table-show-number-of-inf-in-colums

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!