R 根据对data.table中的列所做的计算选择整行

R 根据对data.table中的列所做的计算选择整行,r,data.table,R,Data.table,我知道data.table允许您基于列中的组进行计算。比如说 可复制示例 iris[,.SD[which.min(Petal.Width)], by=Species] iris iris <- as.data.frame(iris) #in case reader does not start new R session f.min <- function(spec) { spec.sub <- iris[iris$Species==spec,] m

我知道data.table允许您基于列中的组进行计算。比如说

可复制示例

iris[,.SD[which.min(Petal.Width)], by=Species]
iris        
iris <- as.data.frame(iris) #in case reader does not start new R session    

f.min <- function(spec) {
spec.sub <- iris[iris$Species==spec,]
min.rows <- spec.sub[spec.sub$Petal.Width == min(spec.sub$Petal.Width),]
}             

do.call(rbind, lapply(levels(iris$Species), f.min ))
生成

 Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1:     setosa          4.9         3.1          1.5         0.1
2: versicolor          4.9         2.4          3.3         1.0
3:  virginica          6.1         2.6          5.6         1.4
我希望每一行都能达到最低要求;不仅仅是第一个,在DF中很容易实现:

例如:

 Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
10           4.9         3.1          1.5         0.1     setosa
13           4.8         3.0          1.4         0.1     setosa
14           4.3         3.0          1.1         0.1     setosa
33           5.2         4.1          1.5         0.1     setosa
38           4.9         3.6          1.4         0.1     setosa
58           4.9         2.4          3.3         1.0 versicolor
61           5.0         2.0          3.5         1.0 versicolor
63           6.0         2.2          4.0         1.0 versicolor
68           5.8         2.7          4.1         1.0 versicolor
80           5.7         2.6          3.5         1.0 versicolor
82           5.5         2.4          3.7         1.0 versicolor
94           5.0         2.3          3.3         1.0 versicolor
135          6.1         2.6          5.6         1.4  virginica
我不想要的只是满足最小值的第一个实例:

这相当于使用data.frame执行类似操作

iris[,.SD[which.min(Petal.Width)], by=Species]
iris        
iris <- as.data.frame(iris) #in case reader does not start new R session    

f.min <- function(spec) {
spec.sub <- iris[iris$Species==spec,]
min.rows <- spec.sub[spec.sub$Petal.Width == min(spec.sub$Petal.Width),]
}             

do.call(rbind, lapply(levels(iris$Species), f.min ))
虹膜 虹膜试试:

这将为您提供最低值,但不显示领带

      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1:     setosa          4.9         3.1          1.5         0.1
2: versicolor          4.9         2.4          3.3         1.0
3:  virginica          6.1         2.6          5.6         1.4
显示联系的dplyr解决方案包括:

require(dplyr)
require(magrittr)
iris %>% 
  group_by(Species) %>% 
  filter(rank(Petal.Width, ties.method= "min") == 1)
资料来源:本地数据表[13 x 5] 组:种

   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1           4.9         3.1          1.5         0.1     setosa
2           4.8         3.0          1.4         0.1     setosa
3           4.3         3.0          1.1         0.1     setosa
4           5.2         4.1          1.5         0.1     setosa
5           4.9         3.6          1.4         0.1     setosa
6           4.9         2.4          3.3         1.0 versicolor
7           5.0         2.0          3.5         1.0 versicolor
8           6.0         2.2          4.0         1.0 versicolor
9           5.8         2.7          4.1         1.0 versicolor
10          5.7         2.6          3.5         1.0 versicolor
11          5.5         2.4          3.7         1.0 versicolor
12          5.0         2.3          3.3         1.0 versicolor
13          6.1         2.6          5.6         1.4  virginica
“ties.method”参数用于选择应显示的内容


希望这有帮助。

您应该能够从(提示:检查
.SD
部分)或此处的多个Q中找到答案。。