在R中按指定列分组,获取对应列各层级的最小值方法
在R中按A2、A3分组并提取number各层级的time最小值
示例数据集
df <- structure(list(ID=c('a','a','a','a','b','b','b','b','c','c','c','c','d','d','d','d','e','e','e','e','f','f','f','f','g','g','g','g','h','h','h','h'), A2=c('d1','d1','d1','d1','d1','d1','d1','d1','d2','d2','d2','d2','d2','d2','d2','d2','d1','d1','d1','d1','d1','d1','d1','d1','d2','d2','d2','d2','d2','d2','d2','d2'), A3=c('g1','g1','g1','g1','g1','g1','g1','g1','g1','g1','g1','g1','g1','g1','g1','g1','g2','g2','g2','g2','g2','g2','g2','g2','g2','g2','g2','g2','g2','g2','g2','g2'), number=c('1','1','2','2','1','1','2','2','1','1','2','2','1','1','2','2','1','1','2','2','1','1','2','2','1','1','2','2','1','1','2','2'), time=c(23,345,123,4,434,76,245,34,135,98,45,678,32,134,76,578,32,145,256,79,311,356,67,12,689,467,98,456,23,45,23,34)), class = "data.frame", row.names = c(NA,-32L))
解决方案
方法1:使用dplyr包(推荐,代码简洁易读)
library(dplyr) df.result <- df %>% # 按A2、A3、ID、number分组(需保留ID故加入分组) group_by(A2, A3, ID, number) %>% # 提取每组time的最小值 summarize(time = min(time), .groups = "drop") %>% # 调整行顺序匹配期望结果 arrange(A2, A3, ID, number)
方法2:使用base R(无需额外安装包)
# 按指定列分组计算time最小值 df.result <- aggregate(time ~ A2 + A3 + ID + number, data = df, FUN = min) # 调整行顺序 df.result <- df.result[order(df.result$A2, df.result$A3, df.result$ID, df.result$number), ] # 重置行名 rownames(df.result) <- NULL
验证结果
运行上述代码后,可通过以下代码确认结果与期望一致:
# 期望结果数据集 df.expected <- structure(list(ID=c('a','a','b','b','c','c','d','d','e','e','f','f','g','g','h','h'), A2=c('d1','d1','d1','d1','d2','d2','d2','d2','d1','d1','d1','d1','d2','d2','d2','d2'), A3=c('g1','g1','g1','g1','g1','g1','g1','g1','g2','g2','g2','g2','g2','g2','g2','g2'), number=c('1','2','1','2','1','2','1','2','1','2','1','2','1','2','1','2'), time=c(23,4,76,34,98,45,32,76,32,79,311,12,467,98,23,23)), class = "data.frame", row.names = c(NA,-16L)) # 检查是否一致 all.equal(df.result, df.expected)
内容的提问来源于stack exchange,提问作者Pegi
相关产品推荐
相关产品推荐

