r - 在 dplyr 中按行计算和正常计算之间切换

标签 r dplyr

我想我只是遇到了一个小问题,但我不知道如何解决。我想计算每行的 max 值,并有一列的排名取决于类别。

df <- data.frame(cat=rep(letters[1:5], each=5),
                 a=runif(25),
                 b=runif(25),
                 c=runif(25))

df %>%
  group_by(cat) %>%
  rowwise() %>%
  mutate(MAX=max(a,b,c),
         RANK=rank(MAX))

排名始终为 1,我猜是因为 rowwise 函数调用,但不确定。

是否还有一种方法可以自动使用除 cat 列之外的所有列? 提前致谢!

最佳答案

使用pmax代替:

df %>%
   group_by(cat) %>%
   mutate(MAX = pmax(a,b,c), RANK = rank(MAX))

#Source: local data frame [25 x 6]
#Groups: cat [5]
#
#      cat         a         b         c       MAX  RANK
#   (fctr)     (dbl)     (dbl)     (dbl)     (dbl) (dbl)
#1       a 0.8514743 0.4051721 0.5547097 0.8514743     3
#2       a 0.2599851 0.3559089 0.2878979 0.3559089     1
#3       a 0.1269608 0.6784622 0.1088647 0.6784622     2
#4       a 0.6764552 0.9013046 0.8811285 0.9013046     4
#5       a 0.9284667 0.3482491 0.9241917 0.9284667     5
#6       b 0.7799539 0.8811926 0.6788580 0.8811926     3
#7       b 0.8974519 0.8499074 0.1847301 0.8974519     4
#8       b 0.6819014 0.9334878 0.6150482 0.9334878     5
#9       b 0.2539325 0.1707934 0.2902184 0.2902184     1
#10      b 0.7913689 0.5555206 0.3349121 0.7913689     2
#..    ...       ...       ...       ...       ...   ...

pmaxpmin 返回输入值的 p 并行最大值和最小值。这意味着,您不需要按行分组(使用 rowwise)。

小例子:

pmax(1:5, 5:1)
#[1] 5 4 3 4 5

如果您需要更大的灵活性,可以分两步完成:

df %>%
    rowwise() %>% 
    mutate(MAX = max(a,b,c)) %>% 
    group_by(cat) %>% 
    mutate(RANK = rank(MAX))

但对于所描述的示例,pmax 显然是更好的方法。

另一种选择是使用rowMeans:

df %>% 
    mutate(MAX = rowMeans(.[c('a','b','c')])) %>% 
    group_by(cat) %>% 
    mutate(RANK = rank(MAX))

如果您不想手动指定列名称,可以使用 do.call 并排除第一列:

df %>% mutate(MAX = do.call(pmax, .[-1]))

关于r - 在 dplyr 中按行计算和正常计算之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35484722/

相关文章:

r - 如何使用 dplyr 中的 mutate 创建一系列由指定突变值的向量定义和调用的列?

r - 将表达式传递到 `MoreArgs` 的 `mapply`

r - 创建 tibble 时设置列名称时出错

r - 如何使用 Caret 包调整多个参数?

R:使用字符串作为参数来改变dplyr中的动词

r - 根据列中的序列中断对数据框进行分组?

r - 如何在dplyr中使用多列实现一个函数

r - 如何舍入时间?

r - OpenBUGS : missing value in Bernoulli distribution

r - gsub : Removing a special character at the end of a string in R