2012-03-22 60 views
7

我想识别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

回答

8
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值)

+0

我可能会尝试用函数(x)长度(unique(x))> 2捕获不同于0,1的二元变量。也许? – Seth 2012-03-22 21:53:38

+1

如果它们不全都用0,1编码,你可以检查'length(unique(x)'只有两个值。 – joran 2012-03-22 21:56:29

+0

@Seth,@Joran,这些都是好主意,但是如果你的表是'matrix(c (0,1,0,1,1,2),nrow = 3)'你想让第二列被检测为二进制??你必须要更加仔细。也就是说,我想这取决于如何你定义了“二进制” – 2012-03-22 22:14:39

3

如果你想接受他们与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) 
} 
+0

看到我上面的评论 - 我认为将'二进制'基于长度(unique(x))== 2'可能是危险的。 .. – 2012-03-22 22:16:11

+0

...所以我添加了另一个版本,只接受0/1/NA。 – Tommy 2012-03-22 22:17:57

+0

好的,对不起,错过了。 – 2012-03-22 22:18:57