以下是一个例子:
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
我要意识到的是,通过忽略X
来选择Y
的唯一行NA
:{/ p>
a 4 68
b 1 4
c 2 64
最好的方法是什么?
答案 0 :(得分: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或其他软件包的解决方案。
答案 1 :(得分: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
答案 2 :(得分: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)
答案 3 :(得分: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]]