我想識別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