我的R data.frame df
看起来像:
Name Amount
1 "A" 150
2 "B" 120
3 "C" "NA"
4 "D" 160
.
.
.
当我执行min(df$Amount)
之类的操作时,我想获取名称和金额行。
这使我获得Amount列中的最小数字,但是如何在同一行中获取Name?或整个行?
在这种情况下,名称应为“B”。
与Select * Where Amount = min(Amount)
类似
在R中执行此操作的最佳方法是什么?
答案 0 :(得分:31)
@ Zelazny7的答案有效,但如果你想保持关系,你可以这样做:
df[which(df$Amount == min(df$Amount)), ]
例如,使用以下数据框:
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
修改:如果Amount
列中有NA,您可以执行以下操作:
df[which(df$Amount == min(df$Amount, na.rm = TRUE)), ]
答案 1 :(得分:5)
使用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
来自帮助文档:
确定位置,即(第一个)最小值或最大值的索引 数字(或逻辑)向量。
答案 2 :(得分:2)
基于提供的语法
Select * Where Amount = min(Amount)
您可以使用:
library(sqldf)
使用@Kara Woo的示例df
sqldf("select * from df where Amount in (select min(Amount) from df)")
#Name Amount
#1 B 120
#2 E 120
答案 3 :(得分:2)
您可以使用dplyr
:
df %>% group_by("Amount") %>% slice(which.min(x))