我想识别data.frame中的二进制列。识别二进制列
例如,此表
my.table <-read.table(text="a,b,c
0,2,0
0.25,1,1
1,0,0", header=TRUE, as.is=TRUE,sep = ",")
会给FALSE, FALSE, TRUE
我想识别data.frame中的二进制列。识别二进制列
例如,此表
my.table <-read.table(text="a,b,c
0,2,0
0.25,1,1
1,0,0", header=TRUE, as.is=TRUE,sep = ",")
会给FALSE, FALSE, TRUE
apply(my.table,2,function(x) { all(x %in% 0:1) })
(或
apply(my.table,2,function(x) { all(na.omit(x) %in% 0:1) })
,如果你想允许NA
值)
如果你想接受他们与NA二进制列,下面应该做的伎俩:
is.binary <- function(v) {
x <- unique(v)
length(x) - sum(is.na(x)) == 2L
}
my.table <- data.frame(a=11:15, b=c(T,F,T,NA,T), c=c('foo',NA,'bar','bar','foo'))
vapply(my.table, is.binary, logical(1))
# a b c
#FALSE TRUE TRUE
...或者,如果你只接受0,1,NA:
is.binary <- function(v) {
x <- unique(v)
length(x) - sum(is.na(x)) == 2L && all(x[1:2] == 0:1)
}
看到我上面的评论 - 我认为将'二进制'基于长度(unique(x))== 2'可能是危险的。 .. – 2012-03-22 22:16:11
...所以我添加了另一个版本,只接受0/1/NA。 – Tommy 2012-03-22 22:17:57
好的,对不起,错过了。 – 2012-03-22 22:18:57
我可能会尝试用函数(x)长度(unique(x))> 2捕获不同于0,1的二元变量。也许? – Seth 2012-03-22 21:53:38
如果它们不全都用0,1编码,你可以检查'length(unique(x)'只有两个值。 – joran 2012-03-22 21:56:29
@Seth,@Joran,这些都是好主意,但是如果你的表是'matrix(c (0,1,0,1,1,2),nrow = 3)'你想让第二列被检测为二进制??你必须要更加仔细。也就是说,我想这取决于如何你定义了“二进制” – 2012-03-22 22:14:39