2016-11-22 2 views
1

Пусть я следующие data:Как удалить нежелательные функции в R?

   'aaa'  'a'  'aaron'  'abcde'  'azz' 
     x1 ...  ...  ...   ...  ... 
     x2 ...  ...  ...   ...  ... 
     x3 ...  ...  ...   ...  ... 

Учитывая предопределенный список английских слов, как я могу использовать оператор which(.. %in% ..), чтобы получить вектор позиции для того, чтобы сохранить только те функции, которые существуют в пре -определенный список английских слов?

Ожидаемый результат:

 'a'  'aaron'  
x1 ...  ...  
x2 ...  ...  
x3 ...  ...  
+2

Не очень ясно. Пожалуйста, объясните немного более четко. Если у вас есть вектор имен i.e. 'v1', тогда' df1 [, colnames (df1)% in% v1] ' – akrun

ответ

1

Если у вас есть список имен столбцов вы хотите сохранить вы можете запустить это:

dat = dat[, colnames(dat) %in% list] 

Если у вас есть список имен столбцов, вы не хотите, чтобы вы можете запустить:

dat = dat[, !(colnames(dat) %in% list)] 

Если вы используете data.table вы будете иметь, чтобы включить в = FALSE для этого.

dat = dat[, colnames(dat) %in% list, with = FALSE] 
+0

Использование (.) Вокруг логического вектора не является такой хорошей идеей. Продолжайте индексировать логический вектор, который '% in%' производит. Затем, что еще более важно, '-which (..)' is * опасно *, он плохо терпит неудачу, когда нет совпадения, где '! (... <ваш логический> ..)' отлично работает в этом случае. @ akrun ответ лучше –

+0

@ MartinMächler Спасибо за отзыв. Я обновил код. Можете ли вы объяснить, почему индексирование с помощью логических векторов является плохим? Я знаю, что это не обязательно, но действительно ли это вызовет ошибки или проблемы с производительностью? – Kristofersen

1

Вы можете сделать это во многих отношениях. Используя which, вы можете получить вектор желаемых позиций столбцов, а затем выбрать только нужные столбцы:

cols <- which(colnames(data) %in% list) 
data[cols] 

Другой подход заключается в использовании dplyr выберет:

data %>% select_(.dots = list) 
3

Если у нас есть вектор имена, а затем использовать %in%

df1[,colnames(df1) %in% v1] 
1

(Длинный ответ на вопрос по @Kristofersen вчера) Это обратное: индексация с логическими векторами хорошо и безопаснее: Я дал одну важную причину уже выше: «-Какой (...) ». Пожалуйста, попытайтесь создать такой пример «нет соответствия» и убедитесь сами. Вторая причина: Обработка (случайная) NA: Если ваш логический вектор содержит NA, который (.) Все исключает их, и вы не замечаете, что что-то странно с вашими данными (поскольку это обычно является причиной того, что NA логический вектор.
Третья причина: вы можете легко и/или (то есть , |) логических векторов при появлении новых условий для выбора. Эквивалент для векторов с целым индексом более подвержен ошибкам ((хотя часто вы можете работать с объединением()/intersect()/setdiff() там ..)) Сохранение вещей логично чище и безопаснее, а использование which(.) вокруг логических векторов для индексации - это плохой практика, замеченная во слишком многих местах в коде R. Я не знаю, у меня есть время для «лекции» на этом прямо сейчас, извините.

Смежные вопросы