如何检测二进制和& r

时间:2015-08-03 15:15:07

标签: r function identity-column

我有一个包含二进制,分类列的数据集,但编码为谨慎的数字和连续特征。我正在尝试构建一个函数,找出不包含数值的列索引。

下面给出了一个示例数据集:

data <- data.frame(var1=c(rep(1,5),rep(0,5)),var2=c(rep(0,2),rep(1,8)),
  var3=c(1,2,3,4,4,2,3,1,1,2), var4=rnorm(10),
  var5=as.numeric(c(rnorm(6),rep("NA",4))))

  var1 var2 var3       var4       var5
1     1    0    1  0.7312777 -1.3902633
2     1    0    2  0.5120417 -1.2470914
3     1    1    3  1.6502341 -0.9980822
4     1    1    4  0.4298987  0.7766762
5     1    1    4 -0.8025510 -0.5221676
6     0    1    2  0.2001818 -1.2300872
7     0    1    3 -0.5521180         NA
8     0    1    1 -1.7895327         NA
9     0    1    1 -0.5309557         NA
10    0    1    2 -1.7362210         NA

到目前为止,我尝试过以下功能:

is.binary <- function(v) {
  x <- unique(v)
  length(x) - sum(is.na(x)) == 2L && all(x[1:2] == 0:1)
}

该函数确实检测到只有2个值(1,0)的列,即使它们包含&#34; NA&#34;但此函数未正确检测二进制或分类列。当我使用命令运行该函数时:

vapply(data, is.binary, logical(1))

结果是

var1  var2  var3  var4  var5 
FALSE  TRUE FALSE FALSE FALSE 

然而,我正在寻找它以某种方式将前3列标识为二进制/分类。

2 个答案:

答案 0 :(得分:2)

您检查数字与floor(numbers)(或trunc / ceiling)之间的差异是否在数字上无关紧要all.equal

sapply(data, function(x) isTRUE(all.equal(x, floor(x))))
#  var1  var2  var3  var4  var5 
#  TRUE  TRUE  TRUE FALSE FALSE 

对于二进制文件,您可以进一步检查length(unique(trunc(numbers)))==2L

答案 1 :(得分:1)

使用data.table具有方便的uniqueN功能(1.9.5+

library(data.table) #versions 1.9.5+
> setDT(data)[,lapply(.SD,function(x)uniqueN(na.omit(x))<=2)]
   var1 var2  var3  var4  var5
1: TRUE TRUE FALSE FALSE FALSE

如果您想编写自己的功能,可以使用:

is.binary<-function(x)uniqueN(na.omit(x))<=2
> setDT(data)[,lapply(.SD,is.binary)]
   var1 var2  var3  var4  var5
1: TRUE TRUE FALSE FALSE FALSE

您可以使用R基础(如果您坚持使用is.binary进行类似调整):

> sapply(data,function(x)length(unique(na.omit(x)))<=2)
 var1  var2  var3  var4  var5 
 TRUE  TRUE FALSE FALSE FALSE