我有一个包含二进制,分类列的数据集,但编码为谨慎的数字和连续特征。我正在尝试构建一个函数,找出不包含数值的列索引。
下面给出了一个示例数据集:
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列标识为二进制/分类。
答案 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