Проверьте, идентичны ли какие-либо столбцы в фрейме данных в R - PullRequest
0 голосов
/ 19 декабря 2018

Я итеративно подгоняю модели ко многим различным переменным, и в нескольких редких случаях два столбца, которые я использую в качестве независимых переменных, содержат идентичный набор значений.Это делает модель неопознаваемой и выдает ошибку.Мне нужен способ проверить, идентичны ли какие-либо столбцы любым другим столбцам в кадре данных, а затем вернуть имена столбцов, в которых возникла проблема.Вот пример фрейма данных.

a <- rnorm(10)
b <- rnorm(10)
c <- a
d <- rnorm(10)
dat <- data.frame(a,b,c,d)

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

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Вы можете использовать combn, чтобы получить все пары номеров столбцов, а затем применить к полученной матрице, чтобы проверить, равны ли все элементы.

pairs <- t(combn(seq_len(ncol(dat)), 2))

same <- apply(pairs, 1, function(x) all(Reduce(`==`, dat[,x])))

pairs[same,]
# [1] 1 3

Или проверить корреляции (будет также включать линейные комбинации)

cor1 <- data.frame(which(cor(dat) == 1, arr.ind = T))
cor1[cor1$row > cor1$col,]
#   row col
# c   3   1
0 голосов
/ 19 декабря 2018

Вы можете использовать функцию dist, чтобы вычислить матрицу расстояний между столбцами и найти комбинации столбцов, для которых расстояние равно 0.

m = as.matrix(dist(t(dat)))
m[upper.tri(m,diag=T)] = NA
which(m<1.5e-8,arr.ind=T)

  row col
c   3   1

Обратите внимание, что это решение будет работать толькодля числовых столбцов.Если в вашем фрейме данных есть качественные переменные, вы не сможете их сравнить.

0 голосов
/ 19 декабря 2018

Пакет caret содержит функцию findLinearCombos, которую вы можете попробовать

caret::findLinearCombos(dat)
#$linearCombos
#$linearCombos[[1]]
#[1] 3 1


#$remove
#[1] 3

Но имейте в виду, что функция также рекомендует удалить столбец aраз минус 1

Второй пример

dat2 <- data.frame(a,b,c,d, e = -a) 
caret::findLinearCombos(dat2)
#$linearCombos
#$linearCombos[[1]]
#[1] 3 1

#$linearCombos[[2]]
#[1] 5 1


#$remove
#[1] 3 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...