summary_all由均值或最大值决定,具体取决于dplyr的值?

时间:2018-05-31 15:02:35

标签: r dplyr

嗨,我有一个数据框

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&lt; 0否则使用mean。例如,在此示例中,最终的df应如下所示。

 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 :(得分:2)

我们可以用any包装它,因为. < 0是长度大于1的逻辑vector,而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值,则会将其删除。

答案 1 :(得分:1)

我认为在这种情况下,常规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