найти минимальное значение, которое не равно нулю для каждой группы, используя агрегатную функцию - PullRequest
2 голосов
/ 19 июня 2019

У меня есть следующий набор данных:

6b9691fa    1   0   2   1   4
6b9691fa    1   1   -1  1   5
6b9691fa    1   2   3   0   4
6b9691fa    2   0   1   5   3
6b9691fa    2   1   0   5   3
6b9691fa    2   2   3   5   3
6b9691fa    3   0   10  1   9
6b9691fa    3   1   10  0   9
6b9691fa    3   2   10  1   9

Я хотел бы найти минимальное значение в 4-м, 5-м и 6-м столбцах для каждой группы 2-го столбца (т. Е. Три группы, которые 12 и 3).Минимальное значение не должно быть нулевым.Для этого я сделал следующее:

 aggregate(dataset[,4:6], list(dataset$V2), min)

Но это возвращает ноль.Что я могу сделать, чтобы избежать нуля как минимум?

Ответы [ 3 ]

8 голосов
/ 19 июня 2019

Может быть, это то, что вы хотите:

dataset <- read.table(text = '6b9691fa    1   0   2   1   4
6b9691fa    1   1   -1  1   5
6b9691fa    1   2   3   0   4
6b9691fa    2   0   1   5   3
6b9691fa    2   1   0   5   3
6b9691fa    2   2   3   5   3
6b9691fa    3   0   10  1   9
6b9691fa    3   1   10  0   9
6b9691fa    3   2   10  1   9')

aggregate(x = dataset[, 4:6],
          by = list(dataset[, 2]),
          FUN = function(t) min(t[t != 0]))
#>   Group.1 V4 V5 V6
#> 1       1 -1  1  4
#> 2       2  1  5  3
#> 3       3 10  1  9

Создано в 2019-06-19 пакетом Представить (v0.3.0)

4 голосов
/ 19 июня 2019

С data.table:

setDT(dataset)
dataset[, lapply(.SD, function(x) min(x[x != 0])), by = V2, .SDcols = V4:V6]
#    V2 V4 V5 V6
# 1:  1 -1  1  4
# 2:  2  1  5  3
# 3:  3 10  1  9
2 голосов
/ 19 июня 2019

Просто используйте summarise_each из dplyr

df <- fread("Col1 Col2 Col3 Col4 Col5 Col6
6b9691fa    1   0   2   1   4
6b9691fa    1   1   -1  1   5
6b9691fa    1   2   3   0   4
6b9691fa    2   0   1   5   3
6b9691fa    2   1   0   5   3
6b9691fa    2   2   3   5   3
6b9691fa    3   0   10  1   9
6b9691fa    3   1   10  0   9
6b9691fa    3   2   10  1   9")

df %>% group_by(Col2) %>%
  summarise_each(function(x) min(x[x != 0]),Col4:Col6)


# A tibble: 3 x 4
   Col2  Col4  Col5  Col6
  <int> <int> <int> <int>
1     1    -1     1     4
2     2     1     5     3
3     3    10     1     9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...