dplyr的数值列的总和

Gre*_*urm 1 r dplyr

说,我有一个df带有一些文本和一些数字列的数据框

species            | short | A    | B    | C 
-------------------+-------+------+------+-----
Homo sapiens       | hsa   | 0.1  | 0.2  | 0.7
Mus musculus       | mmu   | 0.3  | 0.7  | 0.0
Rattus norvegicus  | rno   | 0.0  | 1.0  | 0.0
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用dplyr添加一列来计算所有列的最大值,但这仅在所有列都是数字的情况下才有效:

df %>%
    rowwise() %>% 
    mutate(max_score = max(.))
Run Code Online (Sandbox Code Playgroud)

忽略所有非数字列,如何实现相同的目标?

(显然,我可以A, B, C手动命名,但是假设我有一个包含很多列的“胖”数据框。)

Psi*_*dom 5

您可以使用select_ifwith is.numeric来选择数字列,并使用do.call(pmax, ...)来计算行的最大值。pmax返回输入向量的并行最大值,因为它将向量作为单独的参数,所以我们可以使用do.callselect_ifreturn的所有列(数据帧)作为参数传递给pmax

df %>% mutate(max_score = do.call(pmax, select_if(., is.numeric)))

#            species short   A   B   C max_score
#1      Homo sapiens   hsa 0.1 0.2 0.7       0.7
#2      Mus musculus   mmu 0.3 0.7 0.0       0.7
#3 Rattus norvegicus   rno 0.0 1.0 0.0       1.0
Run Code Online (Sandbox Code Playgroud)