Скажем, я хочу написать такую функцию, как:
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
.
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
Почему не простой цикл?
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"))
Похожие вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.