如何按组选择具有最小值且在R中包含NAs的行

如何按组选择具有最小值且在R中包含NAs的行,r,dataframe,na,R,Dataframe,Na,以下是一个例子: set.seed(123) data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12),Z=sample(1:100, 12)) data[data==3]<-NA 最好的方法是什么?使用data.table包,这很简单: library(data.table) d <- data.table(data) d[, min(Y, na.rm=TRUE), by=X] 或使用base

以下是一个例子:

set.seed(123)    
data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12),Z=sample(1:100, 12))
data[data==3]<-NA

最好的方法是什么?

使用
data.table
包,这很简单:

library(data.table)

d <- data.table(data)
d[, min(Y, na.rm=TRUE), by=X]
或使用base R:

aggregate(X ~ ., data=data, FUN=min)

根据编辑,我肯定会使用
data.table

d[, .SD[which.min(Y)], by=X]

但是,也有使用base R或其他包的解决方案。

这不会使用索引选择行,而是返回所需的值

ddply(data, .(X), summarise, min=min(Y, na.rm=T))

  X min
1 a   5
2 b   1
3 c   4
评论后编辑:要选择整行,您可以:

ddply(data, .(X), function(x) arrange(x, Y)[1, ])

  X Y  Z
1 a 4 68
2 b 1  4
3 c 2 64


data$index为每个字母使用子集,这可能会有所帮助

data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12))
dataA <- subset(data, data$X=="a")
min(dataA$Y, na.rm=TRUE)

data有一个
data.table
way

library(data.table)
set.seed(123)    
data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12),Z=sample(1:100, 12))
data[data==3]<-NA
data <- data.table(data)
data[data[,.I[which.min(Y)], by = "X"][,V1]]
库(data.table)
种子集(123)

dataIt适用于这种情况,但实际上我的数据集有20s列。我会选择包含所有列的行,而不是两列的摘要。有什么建议吗?谢谢,恐怕我不明白。请编辑您的问题以反映您的实际。。。问题…它确实适用于这个案例,但我更新了我的示例,使其更符合我的目标。有什么建议吗?
data$index <- 1L:nrow(data)
i <- by(data, data$X, function(x) x$index[which.min(x$Y)] )
data[i, ]

   X Y  Z index
1  a 4 68     1
6  b 1  4     6
10 c 2 64    10
data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12))
dataA <- subset(data, data$X=="a")
min(dataA$Y, na.rm=TRUE)
library(data.table)
set.seed(123)    
data<-data.frame(X=rep(letters[1:3], each=4),Y=sample(1:12,12),Z=sample(1:100, 12))
data[data==3]<-NA
data <- data.table(data)
data[data[,.I[which.min(Y)], by = "X"][,V1]]