Подмножество данных в функции на основе значения в любом столбце - PullRequest
0 голосов
/ 24 октября 2018

Допустим, я хочу написать функцию вроде:

Fn <- function(df, to_remove = NULL) {
  df <- df[!df %in% to_remove,]
}

Цель состоит в том, чтобы удалить все значения в строке (не номера строк / индексы / имена), где одно из значений равно значению(ы) указано в to_remove.

Есть идеи, почему это не работает без указания столбца?

Пример:

df <- data.frame(a = c("a", "a", "a"), b = c("a", "b", "a"))

  a b
1 a a
2 a b
3 a a

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

  a b
1 a a
3 a a

I 'ищу решение base R или data.table.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Почему бы не простой цикл?

rowrem <- function(x, val) {
    for(i in 1:nrow(x)){
        for(j in 1:ncol(x)){
            if(paste(x[i,j]) == val)(
                x <- x[-i,]                
            )
        }
    }
    print(x)
}
Результат
> rowrem(df1, "b")
  a b
1 a a
3 a a

Объяснение : Вы хотите проверить каждое значение каждой отдельной ячейки и вернуться кномер строкиС базой R ваш выбор немного ограничен в этом отношении.Разумное (то есть, поддерживаемое) решение, вероятно, будет примерно таким же, как описано выше, но я уверен, что кто-то также найдет решение lapply или подмножество.

Данные

df1 <- data.frame(a = c("a", "a", "a"), b = c("a", "b", "a"))
0 голосов
/ 24 октября 2018

Чтобы удалить строки, необходимо предоставить индексы строк с отрицательным знаком или вектором (обычно такой же длины, как nrow(df)) с TRUE и FALSE.Ваш код !df %in% to_remove этого не делает.Попробуйте это -

Fn <- function(df, to_remove = NULL) {
  df[!apply(df, 1, function(x) any(x %in% to_remove)), ]
}

Fn(df, "b")
  a b
1 a a
3 a a

Fn(df, c("a", "b"))
[1] a b
<0 rows> (or 0-length row.names)

Fn(df, "d")
  a b
1 a a
2 a b
3 a a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...