根据列中的值返回数据框的行 - R.

时间:2014-07-18 18:30:31

标签: r

我的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中执行此操作的最佳方法是什么?

4 个答案:

答案 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))