Удалить столбцы в data.frame по сумме уровней в R - PullRequest
0 голосов
/ 23 мая 2018

эта проблема раздражает, потому что я ищу ответ все утро и знаю, что ответ должен быть очень простым.

У меня есть df с несколькими факторами или переменными (больше, чем в этом примере) и только два уровня:

row.name  Factor1 Factor2 Factor3 Factor4
1         dog     dog     cat     cat
2         dog     dog     cat     dog
3         dog     cat     dog     dog
4         dog     cat     dog     dog

Теперь я просто хочу отбросить эти столбцы, которые содержат dog и cat > 1

row.name  Factor2 Factor3
1         dog     cat
2         dog     cat
3         cat     dog
4         cat     dog

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

Любая помощь очень ценится.

* edit

Оба подхода Райана сработали для меня после небольшого изменения.Исходные решения содержали только столбцы, которые содержали только dog , например Factor1

row.name  Factor1
1         dog
2         dog
3         dog
4         dog

Следовательно, я изменил его следующим образом:

df %>% 
  select_if(~ !is.factor(.x) | sum(tabulate(.x) > 1) >= 2)

и

df[, sapply(df, function(x) !is.factor(x) | sum(tabulate(x) > 1) >= 2)]

Оба способа работают отлично.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Используется tabulate вместо table, что должно быть быстрее

library(dplyr)

df %>% 
  select_if(~ !is.factor(.x) | sum(tabulate(.x) > 1) <= 1)

#   row.name Factor1 Factor4
# 1        1     dog     cat
# 2        2     dog     dog
# 3        3     dog     dog
# 4        4     dog     dog

Или без dplyr (тот же результат)

df[, sapply(df, function(x) !is.factor(x) | sum(tabulate(x) > 1) <= 1)]

Это выбирает все не-факторные столбцы и факторные столбцы с 1 или менее уровнями, которые появляются более одного раза.

0 голосов
/ 23 мая 2018

Мы можем перебрать столбцы, получить table и проверить, больше ли обе частоты, чем 2

i1 <- colSums(sapply(df1[-1], function(x) 
       table(factor(x, levels = c("cat", "dog"))))>1) <=1

df1[c(TRUE, i1)]
#  row.name Factor1 Factor4
#1        1     dog     cat
#2        2     dog     dog
#3        3     dog     dog
#4        4     dog     dog

ПРИМЕЧАНИЕ. Здесь мы предполагаем, что row.name - это столбец, поэтомуубрал первый столбец из сравнения (df1[-1]) и объединил с TRUE при поднаборе

...