如何在R中按组选择包含NA的最小值行

3

以下是一个例子:

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

我需要实现的是通过忽略 NA,选择具有最小 Y 值的唯一 X 行:

a 4 68
b 1 4
c 2 64

什么是最好的方法来做到这一点?
4个回答

7
使用data.table包,这很简单:
library(data.table)

d <- data.table(data)
d[, min(Y, na.rm=TRUE), by=X]

您还可以使用plyr及其ddply函数:

library(plyr)

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

或者使用基础 R:

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

根据编辑内容,我肯定会使用 `data.table`。
d[, .SD[which.min(Y)], by=X]

然而,可以使用基本R或其他软件包来解决问题。


它对于这个案例有效,但实际上我的数据集有20列。我想选择所有列的行,而不是两列的摘要。有什么建议吗?谢谢 - David Z
很抱歉,我不明白。请编辑您的问题以反映您实际的问题。 - Justin

1
这并不是使用索引选择行,而是返回您想要的值...
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 <- 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

它在这种情况下可以工作,但我更新了我的示例以更具体地实现我的目标。有什么建议吗? - David Z

0

使用子集来处理每个字母,也许这可以帮助解决问题。

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)

0

有一种 data.table 的方法

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]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接