2012-03-22 61 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