DATA = data.table(col1 = rbinom(10,10,.5),
col2 = rnorm(10),
col3 = rbinom(10,1,.5),
col4 = rbinom(10,10,.5),
col5 = rbinom(10,1,.5))
У меня есть большой набор данных, в котором непрерывные переменные относятся к классу integer
или numeric
, а категориальные переменные относятся к классу integer
. Поэтому я ищу другое правило, которое позволило бы мне различать непрерывные и категориальные переменные. Все категориальные переменные - 0-1
, как показано в таблице.
Поскольку набор данных велик, я бы предпочел использовать пакет data.table
.
Он предназначен для автоматической обработки.
Затем добавьте ожидаемый результат к вашему вопросу (например, хотите ли вы иметь два вектора с именами столбцов), чтобы помочь нам дать точный ответ. СПАСИБО :-)
Ты можешь сделать:
apply(DATA, 2, function(x) ifelse(all(x %in% 0:1), 1, 0))
Или:
apply(DATA, 2, function(x) all(x %in% 0:1))
Я хотел бы предложить более общее решение:
Почему? Что произойдет, если у вас есть грязные данные в категориальных столбцах (например, значение> 1)?
Если ваш набор данных достаточно велик, вы можете попытаться свести в таблицу (table
) каждый столбец и подсчитать отдельные значения. Небольшое количество различных значений - хороший индикатор для категориальной переменной:
library(data.table)
set.seed(123)
size = 1000
data = data.table(
col1 = rbinom(size, 10, .5),
col2 = rnorm(size),
col3 = rbinom(size, 1, .5),
col4 = rbinom(size, 10, .5),
col5 = rbinom(size, 1, .5)
)
lapply(data, function(x) length(table(x)))
# $col1
# [1] 11
#
# $col2
# [1] 1000
#
# $col3
# [1] 2
#
# $col4
# [1] 11
#
# $col5
# [1] 2
Здесь col2, скорее всего, непрерывен, все остальные столбцы кажутся категоричными.
Вы можете использовать абсолютное (максимальное количество разных значений) или относительное (количество разных значений, деленное на количество наблюдений / строк) значение, чтобы разделить результат на непрерывный и категориальный ...
Если вы также хотите узнать минимальное и максимальное значения для каждого столбца, вы можете использовать:
lapply(data, function(x) c(distincts = length(table(x)), min = min(x), msx = max(x) ))
получить
$col1
distincts min msx
11 0 10
$col2
distincts min msx
1000.000000 -2.809775 3.390371
$col3
distincts min msx
2 0 1
$col4
distincts min msx
11 0 10
$col5
distincts min msx
2 0 1
Большое спасибо за предложение, и действительно, пригодилось бы получение более общего решения. Однако в моем случае этот подход не работает, поскольку, например, у меня есть переменная, информирующая о количестве сотовых телефонов, а общее количество различных значений равно 5, что меньше количества уровней для некоторых категориальных переменных.
Для чего предназначен твой ожидаемый отупут? Только для того, чтобы человек мог дальше исследовать данные или для автоматической обработки, которая требует точных имен категориальных переменных?