R—根据第三列的统计数据,将一列的数据按另一列进行聚合

R—根据第三列的统计数据,将一列的数据按另一列进行聚合,r,aggregate,R,Aggregate,假设我有一个R数据框,有3列A、B和C,其中A值并不都是不同的 对于A的所有值,如何得到C的值,其中B是A的最小值? 类似于伪SQL代码:选择C,其中B=minbGroupByA 我已经看过聚合函数,但我不确定它是否可以完成 aggregateB~A,data=mydataframe,min只给出每个A的B的min,但我不知道如何得到相应的C值 是否有一种方法可以使用此聚合的结果对数据帧进行子集划分,以获得C值,和/或可以只在一次聚合调用中完成 谢谢 我想得到的一个例子: 输入: A B

假设我有一个R数据框,有3列A、B和C,其中A值并不都是不同的

对于A的所有值,如何得到C的值,其中B是A的最小值? 类似于伪SQL代码:选择C,其中B=minbGroupByA

我已经看过聚合函数,但我不确定它是否可以完成

aggregateB~A,data=mydataframe,min只给出每个A的B的min,但我不知道如何得到相应的C值

是否有一种方法可以使用此聚合的结果对数据帧进行子集划分,以获得C值,和/或可以只在一次聚合调用中完成

谢谢

我想得到的一个例子:

输入:

A   B   C
1   0   1
1   2   2
1   1   3
1   1   4
2   1   1
2   2   2
2   0   3
2   3   4
输出:

1
3
1是C的值,对应于A=1时B 0的最小值

3是C的值,对应于A=2的最小值b0。您可以使用data.table包:

或通过以下方式创建基函数:


您可以对A列和B列上的表进行排序:

d<-structure(list(A = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), B = c(0L, 
2L, 1L, 1L, 1L, 2L, 0L, 3L), C = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, 
-8L))
d2<-d[order(d$A, d$B),]
由于在排序后的数据框中,B的值在A的每个值内按升序排列,因此每个不同A值的第一行对应于B的最小值

然后,使用函数duplicated和通常的下标,删除A中未重复的所有行,并仅返回第三列C中的值:

d2[!duplicated(d2$A),3]
[1] 1 3
1 SQLite保证当您使用min或max时,其他列变量将来自同一行,因此我们得到一个特别简单的解决方案:

library(sqldf)

# one minimum per group
sqldf("select A, min(B) B, C from DF group by A")
如果存在重复的最小值,并且我们需要所有这些最小值,则使用works选择:

2在R的基础上使用ave,我们可以做到:

# one minimum per group
subset(DF, !! ave(B, A, FUN = function(x) seq_along(x) == which.min(x)))

# all minima per group
subset(DF, !! ave(B, A, FUN = function(x) x == min(x)))
3如果您确实想使用聚合,请按以下方式操作:

# one minimum per group
sq <- 1:nrow(DF)
DF[aggregate(sq ~ A, DF, function(ix) ix[which.min(DF$B[ix])])$sq, ]

欢迎来到StackOverflow。你能提供一些数据来测试它吗?用headmy_数据就可以了。另外,如果你发布你想要的输出,它将使它可复制。谢谢我用一个例子编辑了这篇文章。谢谢,data.table解决方案非常好而且快速!据我所知,我正试图根据您的解决方案使聚合工作,您知道为什么以下方法不起作用吗aggregatecbindB,C~A,data=mydataframe,functionx,y[which.minx]@JeanpierreNenuphar由于聚合中的函数分别应用于所有列,因此此命令不起作用。有人知道data.tables版本在包中不起作用的原因/如何使data.tables版本在包中起作用吗?
d2[!duplicated(d2$A),3]
[1] 1 3
library(sqldf)

# one minimum per group
sqldf("select A, min(B) B, C from DF group by A")
# all minima per group
sqldf("select * from DF x 
      where x.b = (select min(y.b) from DF y where y.a = x.a)")
# one minimum per group
subset(DF, !! ave(B, A, FUN = function(x) seq_along(x) == which.min(x)))

# all minima per group
subset(DF, !! ave(B, A, FUN = function(x) x == min(x)))
# one minimum per group
sq <- 1:nrow(DF)
DF[aggregate(sq ~ A, DF, function(ix) ix[which.min(DF$B[ix])])$sq, ]