2015-08-03 2 views
2

У меня есть набор данных, который содержит двоичные, категориальные столбцы, но закодированные как скрытые числовые и непрерывные функции. Я пытаюсь создать функцию, которая обнаруживает индексы столбцов, которые не содержат числовых значений.Как определить двоичные и категориальные столбцы, закодированные как дискретные числовые значения в r

Пример набора данных приведен ниже:

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) 
} 

Эта функция не обнаруживает столбцы, которые имеют только два значения (1,0), даже если они содержат «NA», но эта функция не распознает двоичные или категориальные столбцы правильно. когда я запускал функцию, используя команду:

vapply(data, is.binary, logical(1)) 

результат был

var1 var2 var3 var4 var5 
FALSE TRUE FALSE FALSE FALSE 

В то время как я ищу для того, чтобы определить первые 3 колонки в виде двоичного/категоричен каким-то образом.

+1

первых, наконечник : просто используйте 'var5 = c (rnorm (6), rep (NA, 4)))' – MichaelChirico

+0

Я сделал, и он работал на var5 правильно, поскольку он идентифицировал var5 как не двоичный столбец. – syebill

+0

Если я использую is.binary <- function (v) { x <- unique (v) length (x) - sum (is.na (x)) == 2L }, Затем он корректно определяет двоичные столбцы , Как его можно изменить, чтобы определить третий столбец как двоичный? Кроме того, если в двоичном столбце отсутствуют значения, то эта функция не определяет его как двоичный. – syebill

ответ

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 
+0

Может ли эта функция обнаруживать двоичные столбцы, даже если у них есть «NA»? Где я могу найти эту уникальную функцию? Я проверил виньетку data.table, но не смог ее увидеть. Как его можно изменить, чтобы определить третий столбец как «ИСТИНА», поскольку этот столбец также категоричен, но закодирован как числовой? Благодарю. – syebill

+0

Решение nongkrong лучше всего подходит для гибкого подхода к обнаружению многочленных переменных; это лучше всего для двоичных файлов.'uniqueN' доступен в версии разработки' data.table', см. инструкции [здесь] (https://github.com/Rdatatable/data.table) – MichaelChirico

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