Как принять не пропущенное значение, связанное с максимальным индексом для каждой группы, используя sumrize_all - PullRequest
0 голосов
/ 05 января 2019

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

Я довольно близко подошел к использованию sumrize_all with which.max, но я не уверен, как удалить NA из каждого вектора, прежде чем я найду последнее значение. Я читал об использовании na.rm в sumrize_all с такими функциями, как mean, но не уверен, как включить подобные функции без встроенной функции. Я пробовал na.omit, но он не обеспечивает решение, которое я ищу.

a <- head(iris, 10)
a$num <- 1:10
a$grp <- c("a","a","a","b","b","c","c","d","d","d")
a[10, "Species"] <- NA
a %>%
  group_by(grp) %>%
  summarize_all(funs(na.omit(.)[which.max(num)]))

grp   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   num
<chr>          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <int>
1 a             4.70        3.20         1.30       0.200 setosa      3
2 b             5.00        3.60         1.40       0.200 setosa      5
3 c             4.60        3.40         1.40       0.300 setosa      7
4 d             4.90        3.10         1.50       0.100 NA         10

Я ожидаю, что все значения в столбце Species будут setosa, однако последнее значение - NA.

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Вместо того, чтобы смотреть на все num, мы можем смотреть только на те, где соответствующая переменная не NA:

a %>%
  group_by(grp) %>%
  summarize_all(funs(na.omit(.)[which.max(num[!is.na(.)])]))
# A tibble: 4 x 7
#   grp   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   num
#   <chr>        <dbl>       <dbl>        <dbl>       <dbl> <fct>   <int>
# 1 a              4.7         3.2          1.3         0.2 setosa      3
# 2 b              5           3.6          1.4         0.2 setosa      5
# 3 c              4.6         3.4          1.4         0.3 setosa      7
# 4 d              4.9         3.1          1.5         0.1 setosa     10
0 голосов
/ 05 января 2019

Вы также можете подойти к этому немного по-другому и завершить сначала дело NA:

library(tidyverse)

a %>% group_by(grp) %>% 
  fill(Species) %>% 
  filter(num == max(num))

tibble: 4 x 7
# Groups:   grp [4]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species   num grp  
         <dbl>       <dbl>        <dbl>       <dbl> <fct>   <int> <chr>
1          4.7         3.2          1.3         0.2 setosa      3 a    
2          5           3.6          1.4         0.2 setosa      5 b    
3          4.6         3.4          1.4         0.3 setosa      7 c    
4          4.9         3.1          1.5         0.1 setosa     10 d 
0 голосов
/ 05 января 2019

если вы используете подход data.table, вы можете попробовать:

library (data.table)
a = data.table (a)
a [is.finite (Species), by = grp, .SD [which.max (num) ] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...