2016-01-28 3 views
0

Я дал сценарий, чтобы расширить и был я вижу, эта картина очень много:Абстрактный узор Подменю

newdf <- df[ which(df$someCol %in% c(values...)), ] 

После ломать голову над этим некоторое время я понял, что это подмножества набора данных, основанный на наличие значений внутри столбца. Чтобы сделать код более удобным для чтения, я хотел отвлечь его на функцию. Например:

subset_column.vals <- function(x, col, selectors) { 
    return(x[which(x$col %in% selectors),]) 
} 

Но функция всегда возвращает фрейм данных с 0 строками. Даже когда выражение с теми же входами вне функции возвращает ожидаемый результат. Кто-нибудь знает, что происходит не так?

+2

такая функция существует: 'dplyr :: filter (col% in% selectors)' например. Кроме того, вам не хватает ',]' после селекторов – scoa

+1

Не используйте '.' в именах переменных/функций! Это ужасное соглашение с первых дней R и беспорядок с поиском методов S3. Вместо этого рекомендуется использовать '_' последовательно повсюду. –

+0

Спасибо за подсказку @ KonradRudolph! У меня это происходит по всему сценарию, который я унаследовал. Человек, который написал это, также был новичком. – JoeM05

ответ

1

Есть уже функции, которые делают это достаточно эффективно. Например:

  • использованием dplyr: dplyr::filter(x,col %in% selectors)
  • в базовой г: subset(x,col %in% selectors)

Если мы действительно хотим, чтобы написать еще один, это будет работать:

subset_column_vals <- function(x, col, selectors) { 
    return(x[x[,col] %in% selectors,]) 
} 

subset_column_vals(iris,"Species",c("setosa")) 

Обратите внимание, что мы используем [ вместо $ для подмножества data.frame, потому что $ do es не работают хорошо с цитируемыми аргументами.

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