Удалить строки с нулевыми значениями в столбце, когда ноль появляется на всех уровнях фактора - PullRequest
0 голосов
/ 19 декабря 2018

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

Например, в случае ниже team One имеет нулевую ошибку, поэтому строки 1,4 и 7должны быть удалены.Так что если alpha=beta=gamma=0 в конкретном team, то те строки с нулем должны быть удалены.

+----+-------+-------+--------+
| id | team  | error | method |
+----+-------+-------+--------+
|  1 | One   |     0 | alpha  |
|  2 | Two   |   5.7 | alpha  |
|  3 | Three |     0 | alpha  |
|  4 | One   |     0 | beta   |
|  5 | Two   |     0 | beta   |
|  6 | Three |     0 | beta   |
|  7 | One   |     0 | gamma  |
|  8 | Two   |     0 | gamma  |
|  9 | Three |   6.7 | gamma  |
+----+-------+-------+--------+

Полученная таблица должна быть:

+----+-------+-------+--------+
| id | team  | error | method |
+----+-------+-------+--------+
|  2 | Two   |   5.7 | alpha  |
|  3 | Three |     0 | alpha  |
|  5 | Two   |     0 | beta   |
|  6 | Three |     0 | beta   |
|  8 | Two   |     0 | gamma  |
|  9 | Three |   6.7 | gamma  |
+----+-------+-------+--------+

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Если исходный фрейм данных равен df, отфильтруйте, если есть error в группе team ненулевое значение:

library(dplyr)
df %>% group_by(team) %>% 
       filter(any(error!=0))
0 голосов
/ 19 декабря 2018

Короткий способ сделать это с базой r:

subset(df, ave(error, team)!=0)

Это отфильтровывает все team s со средней ошибкой, равной нулю ... и может быть проблематичным, если, например, можетбыть отрицательными значениями error (скажем, c(-1, -2, 3)).

Таким образом, более общий случай будет

subset(df, !ave(error, team, FUN=function(x) all(x==0)))

.. или используя идею из ответа Акруна:

subset(df, ave(error %in% 0, team) < 1)
0 голосов
/ 19 декабря 2018

После группировки по 'команде' мы можем проверить, является ли sum логического вектора (error != 0) больше 0, то есть хотя бы один ненулевой элемент

library(dplyr)
df %>% 
   group_by(team) %>% 
   filter(sum(error !=0 ) > 0)

Или используялогика с ==

df %>%
   group_by(team) %>%
   filter(sum(error == 0) < n())

данными

df <- structure(list(id = 1:9, team = c("One", "Two", "Three", "One", 
 "Two", "Three", "One", "Two", "Three"), error = c(0, 5.7, 0, 
 0, 0, 0, 0, 0, 6.7), method = c("alpha", "alpha", "alpha", "beta", 
 "beta", "beta", "gamma", "gamma", "gamma")), class = "data.frame", 
 row.names = c(NA, -9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...