Summarise_all либо среднее или максимальное в зависимости от значения с dplyr? - PullRequest
0 голосов
/ 31 мая 2018

Привет, у меня есть фрейм данных

d<- data.frame (type=c("rna","rna","rna"), value = c(1,2,3) )
d2 <- data.frame (type=c("dna","dna"), value = c(20,30) )
d3 <- data.frame (type=c("protein","protein","protein"), value = c(-9.6,300, 1000) )
df <- rbind (d,d2,d3)

     type  value
1     rna    1.0
2     rna    2.0
3     rna    3.0
4     dna   20.0
5     dna   30.0
6 protein   -9.6
7 protein  300.0
8 protein 1000.0

Я бы хотел использовать условное среднее или максимальное.Используйте max, если есть хотя бы одно значение, которое <0, иначе используйте среднее.Например, в этом примере финальный df должен выглядеть следующим образом.</p>

 value    type
1   1000 protein
2    25     dna
3     2     rna

Я попытался обобщить как таковой, но это ошибки.

df %>%
group_by(type) %>%
summarise_all(
    funs(
 if (. < 0 ){max}
 else{mean}
) )

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я думаю, что регулярное выражение summarise более интуитивно в этой ситуации.

df %>% 
  group_by(type) %>% 
  summarise(value = ifelse(any(value<0),max(value),mean(value)))

#  type      value
#  <fct>     <dbl>
#1 rna        2.00
#2 dna       25.0 
#3 protein 1000 
0 голосов
/ 31 мая 2018

Мы можем заключить его в any, так как . < 0 - это логическая vector длины больше 1, а if/else работает на одном элементе TRUE / FALSE.Итак, оберните any, чтобы вернуть этот единственный элемент

df %>% 
   group_by(type) %>% 
   summarise_all(funs(if(any(. < 0)) max(.) else mean(.)))
# A tibble: 3 x 2
#  type    value
#  <fct>   <dbl>
#1 rna         2
#2 dna        25
#3 protein  1000

Если нам нужно получить среднее значение только для положительных чисел

df %>% 
  group_by(type) %>% 
  summarise_all(funs(mean(.[.>= 0], na.rm = TRUE)))

ПРИМЕЧАНИЕ: Здесь мы предполагаем, что вИсходный набор данных, есть больше числовых столбцов, чтобы получить mean.Лучше добавлять na.rm = TRUE везде, где есть параметр.Если в наборе данных есть значения NA, он будет удален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...