Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr中行计算和正常计算之间的切换_R_Dplyr - Fatal编程技术网

dplyr中行计算和正常计算之间的切换

dplyr中行计算和正常计算之间的切换,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() %>% mutat

我想我只有一个小问题,但我不知道如何解决它。我想计算每行的
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))
df%
分组依据(类别)%>%
行()
变异(MAX=MAX(a,b,c),
秩=秩(最大值))
排名始终为1,我想是因为
按行
函数调用,但不确定

是否还有一种方法可以自动使用除
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
#..    ...       ...       ...       ...       ...   ...
pmax
pmin
返回输入值的平行最大值和最小值。这意味着,您不需要按行分组(使用
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]))

你能解释一下吗?我基本上用
mean
做了同样的尝试,并对平均值进行了排名。。。我想没有
pmean
?!谢谢你的补充意见。有没有办法自动获取列名?我尝试了
pmax(names(df)[-1])
但这似乎不起作用。请参阅
帮助(“which.max”)
@drmariod,查看我的最后一点回答谢谢,这很有帮助!最后,我的情况有所不同,因为我使用了
data.table
而不是
data.frame
,但我让它工作了。谢谢