嗨,我有一个数据框
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}
) )
答案 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