Удалить одну строку при применении функции к столбцам через цикл - PullRequest
2 голосов
/ 26 апреля 2019
set.seed(1234)
df <- data.frame(
    cola = runif(10, min=0, max=100),
    colb = runif(10, min=0, max=100),
    colc = runif(10, min=0, max=100))
df

Вывод вышеуказанного скрипта:

         cola     colb      colc
1  11.3703411 69.35913 31.661245
2  62.2299405 54.49748 30.269337
3  60.9274733 28.27336 15.904600
4  62.3379442 92.34335  3.999592
5  86.0915384 29.23158 21.879954
6  64.0310605 83.72956 81.059855
7   0.9495756 28.62233 52.569755
8  23.2550506 26.68208 91.465817
9  66.6083758 18.67228 83.134505
10 51.4251141 23.22259  4.577026

Моя цель: если one cell value < mean(column)+10, я удалю целые row.
Например,
В row 1, df[1,'cola'] <<code>mean(df$cola), тогда row 1 будет удалено.
В row 2, поскольку df[2,'colc'] <<code>mean(df$colc), тогда row 2 будет удалено.

Наконец, ожидаемый результат:

      cola     colb      colc
6    64.0310605 83.72956 81.059855

Я могу использовать subset(df,cola>mean(cola)+10 & colb>mean(colb)+10 & colc>mean(colc)+10), чтобы получить ожидаемый результат, но это не умный метод, когда во фрейме данных есть сотни столбцов.

Кажется, следует использовать семейство функций apply. Как я могу это сделать?
Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

Использование apply (это может быть медленно):

Res<-as.data.frame(apply(df,2,function(x) ifelse(x<mean(x)+10,0,x)))
Res[!apply(Res,1,function(x) any(x==0)),]

Результат:

cola     colb     colc
6 64.03106 83.72956 81.05986
0 голосов
/ 26 апреля 2019

Однострочное решение с использованием rowSums и colMeans

df[rowSums(df < (colMeans(df) + 10)) == 0, ]
#      cola     colb     colc
#6 64.03106 83.72956 81.05986

или dplyr версия с использованием filter_all и all_vars

library(dplyr)
df %>% filter_all(all_vars(. > (mean(.) + 10)))
0 голосов
/ 26 апреля 2019

Используйте colMeans, чтобы получить среднее значение для каждого столбца, затем выполните итерацию по каждой строке, сравнивая каждое значение со своим средним значением (используя sapply), и, наконец, выберите строку, в которой все результаты равны ИСТИНА (используя [).

> Means <- colMeans(df)+10
> ind <- sapply(seq_along(Means), function(i) df[,i] > Means[i] )
> df[rowSums(ind*1) == ncol(df), ]
      cola     colb     colc
6 64.03106 83.72956 81.05986
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...