如何使用最小值或最大值提取行?

mat*_*teo 22 r

也许是一个简单的问题,但我无法找到解决问题的好方法.像这样的df:

        ID  Year    Temp    ph
1       P1  1996    11.3    6.80
2       P1  1996    9.7     6.90
3       P1  1997    9.8     7.10
...
2000    P2  1997    10.5    6.90
2001    P2  1997    9.9     7.00
2002    P2  1997    10.0    6.93
Run Code Online (Sandbox Code Playgroud)

如果我想知道我输入的最大值在哪里:

which.max(df$Temp)
Run Code Online (Sandbox Code Playgroud)

并且R打印行的索引,例如665.

所以,如果我想读取并提取包含所有相关值的列,我必须输入:

df[665,]
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来知道哪个ID与df的特定列的最大值相关?

Jos*_*ich 51

您可以将您的which.max呼叫作为子集呼叫的第一个参数包括在内:

df[which.max(df$Temp),]
Run Code Online (Sandbox Code Playgroud)

  • @JaySchylerRaadt:参见[Gabor的评论](/sf/ask/1361473081/?noredirect=1#comment28839525_19449615)。尽管您可能需要[如果`Temp`是双精度数,请小心“(/sf/ask/665596291/)。 (2认同)

小智 9

您还可以使用子集和 max 函数来调用该行:

df[df$Temp == max(df$Temp),]
Run Code Online (Sandbox Code Playgroud)


sym*_*ush 6

一个(相对较新的)替代方法是使用slice_max(或slice_min)来自tidyverse. 使用mtcars示例:

library(tidyverse)
mtcars %>% slice_max(mpg)
#                 mpg cyl disp hp drat    wt qsec vs am gear carb
# Toyota Corolla 33.9   4 71.1 65 4.22 1.835 19.9  1  1    4    1

mtcars %>% slice_min(mpg)
#                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
# Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
Run Code Online (Sandbox Code Playgroud)

请注意,slice_maxslice_min为您提供在指定列中具有最大值或最小值的所有行(如 call mtcars[mtcars$mpg == min(mtcars$mpg), ]。因此,如果您只想要第一行(如在 call 中mtcars[which.min(mtcars$mpg), ]),则需要再次切片,如:

mtcars %>% slice_min(mpg) %>% slice(1)
#                     mpg cyl disp  hp drat   wt  qsec vs am gear carb
# Cadillac Fleetwood 10.4   8  472 205 2.93 5.25 17.98  0  0    3    4
Run Code Online (Sandbox Code Playgroud)

此外,slice还为诸如slice_headslice_tail和等常见用例提供了更多帮助函数slice_sample