Удалите строку на основе значения в столбце, используя операторы if

Я надеюсь создать функцию, в которой она удаляет строку, если значение в столбце B меньше среднего значения для всего столбца.

testing<-function(x){
for(n in x){
    if(n < mean(n){
    *drop the entire row*
    }

Пока я могу заставить R удалить только само значение, но не всю строку, поэтому пример использования этой функции будет

df$columnB <- testing(df$columnB)

поэтому входные данные для самой функции поступают только из одного из столбцов, но внутри функции она должна знать, чтобы удалить всю строку, а не только этот столбец, поэтому просто drop (n) будет недостаточно.

Для проверки использовали следующее:

iris_tibble<-as_tibble(iris)

#all values became NA and message saying "argument is not numeric or logical: returning NA"
testing <- function(x) {
  i <- x[,"Sepal.Length"] < mean(x[,"Sepal.Length"])
  return( x[!i,] )
}
testing(iris_tibble)

#Goal
testing <- function(x,y){
  i <- x[,y] < mean(x[,y])
  return( x[!i,] )
}

testing(iris_tibble,"Sepal.Length")
# for-loop if-statement function
Источник
Codelisting
за 0 против

Этого должно хватить:


testing <- function(x, colname) {
    i <- x[,colname] < mean(x[,colname,drop=TRUE])
    return( x[!i,] )
}

dim( iris )
dim( testing( as_tibble(iris), "Sepal.Length" ) )

## cust roughly half of iris away

вы должны дать ему весь свой data.frame и имя столбца, например.testing(df, "foobar") , и запечатлеть то, что он воспроизводит.

  • 0
    Спасибо! Основываясь на вашем ответе, я попытался сделать столбец B гибким, я установил для него функцию (x, y), а затем заменил все «columnB» на y в коде, потому что иногда столбец имеет разные имена и положение. Но он сгенерировал код ошибки, в котором говорилось, что «объект 'list' нельзя принудить к типу 'double'», но когда я glimpse () ничего не является списком, нельзя ли заставить код работать таким образом?
  • 0
    вам нужно будет включить все или часть ваших данных в вопрос на этом этапе
  • 0
    У меня пока нет набора данных, но я скопировал данные радужной оболочки глаза на данный момент, чтобы проверить его, и обновил вопрос, чтобы включить его внизу.
  • 0
    см. мой обновленный ответ, работающий на радужной оболочке в качестве примера .. и для тибла вам нужно drop = TRUE, см. обновленный ответ
  • 0
    Огромное спасибо! И если я хочу предварительно вычислить среднее значение, чтобы линия, присваивающая i, могла быть чище, особенно если я добавлю больше в формулу (например, среднее значение x 2), будет ли следующее правильным? testing <- function(x, colname) { mean_col = mean(x[,colname,drop=TRUE]) i <- x[,colname] < mean_col*2 return(x[!i,]) }
  • 0
    не уверен, что понимаю, что вы имеете в виду, но ваш код там просто отфильтровал бы строки меньше, чем вдвое больше среднего, что означало бы, что гораздо больше строк будет подогнано
  • 0
    Да, отлично, это то, что я тоже надеялся попробовать. Я просто хотел убедиться, что можно установить this mean_col = mean(x[,colname,drop=TRUE]) на строку перед i <- x[,colname] < mean_col*2 и это все равно будет правильным с точки зрения синтаксиса
  • 0
    Хорошо, ну да, это будет
Codelisting
Популярные категории
На заметку программисту