Скажем, я хочу написать такую функцию, как:

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

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

r
0
arg0naut91 24 Окт 2018 в 00:55

2 ответа

Лучший ответ

Чтобы удалить строки, вам необходимо предоставить индексы строк с отрицательным знаком или вектором (обычно той же длины, что и 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
1
Shree 24 Окт 2018 в 11:28

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

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"))
1
Roman 24 Окт 2018 в 10:36
52958373