My R data.frame df looks like:
Name Amount 1 "A" 150 2 "B" 120 3 "C" "NA" 4 "D" 160 . . . I want to get the Name and Amount row when I do something like min(df$Amount).
That gets me the minimum number in the Amount column, but how do I get the Name in that same row? Or the entire row for that matter?
Name should be "B" in this case.
Similar to Select * Where Amount = min(Amount)
What is the best way to do this in R?
14 Answers
@Zelazny7's answer works, but if you want to keep ties you could do:
df[which(df$Amount == min(df$Amount)), ] For example with the following data frame:
df <- data.frame(Name = c("A", "B", "C", "D", "E"), Amount = c(150, 120, 175, 160, 120)) df[which.min(df$Amount), ] # Name Amount # 2 B 120 df[which(df$Amount == min(df$Amount)), ] # Name Amount # 2 B 120 # 5 E 120 Edit: If there are NAs in the Amount column you can do:
df[which(df$Amount == min(df$Amount, na.rm = TRUE)), ] 0Use which.min:
df <- data.frame(Name=c('A','B','C','D'), Amount=c(150,120,175,160)) df[which.min(df$Amount),] > df[which.min(df$Amount),] Name Amount 2 B 120 From the help docs:
5Determines the location, i.e., index of the (first) minimum or maximum of a numeric (or logical) vector.
Based on the syntax provided
Select * Where Amount = min(Amount) You could do using:
library(sqldf) Using @Kara Woo's example df
sqldf("select * from df where Amount in (select min(Amount) from df)") #Name Amount #1 B 120 #2 E 120 1You could use dplyr:
df %>% group_by("Amount") %>% slice(which.min(x))