r - 如何使用 R 基于多个条件为数据框中的每个 id 子集数据
问题描述
我有一个有 1000 行和 4 列的数据框,其中数据框有 100 个 ID。
数据框如下所示:
abc <- data.frame(ID = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2),
A = c(12,12.5,15,16,18,20,25,26,29,35, 12,12.5,15,16,18,20,25,26,29,35),
B = c(20,19,18,17,16,20,25,28,30,35, 20,19,18,17,16,20,25,28,30,35),
C = c(2,1,5,9,10,11,13,18,25,27,2,1,5,9,10,11,13,18,25,27))
这里,第一个条件是从'B'列中选择关于ID的最小值并选择对应的第A列(即对于min(B) = 16,对于ID-1,A = 18)。
第二个条件是从'C'列中选择关于ID的最小值并选择对应的第A列(即对于min(C)= 1,对于ID-1,A = 12.5)
最后,我想根据 ID 对数据框(从 A = 12.5 到 A = 18)进行子集化
预期/期望的输出数据帧如下
abcd <- data.frame(ID = c(1,1,1,1,2,2,2,2),
A = c(12.5,15,16,18,12.5,15,16,18),
B = c(19,18,17,16,19,18,17,16),
C = c(1,5,9,10,1,5,9,10))
我已经尝试了以下代码
library(plyr)
e <- ddply(abc, .(ID), function(z) {
z[z$dmin(abs(z$C)) : min(abs(z$B)), ]
})
但未能获得所需的输出
解决方案
您可以使用which.min
获取C
和B
列的最小值,并在它们之间创建一个序列以在slice
每个ID
.
library(dplyr)
abc %>% group_by(ID) %>% slice(which.min(C):which.min(B))
# ID A B C
# <dbl> <dbl> <dbl> <dbl>
#1 1 12.5 19 1
#2 1 15 18 5
#3 1 16 17 9
#4 1 18 16 10
#5 2 12.5 19 1
#6 2 15 18 5
#7 2 16 17 9
#8 2 18 16 10
推荐阅读
- ios - ios中的ionic 3 geolocation位置错误
- vb.net - 使用 VB .NET 使用 Word 互操作库删除页面
- javascript - 在插件管理开发中使用 Wordpress Gutenberg 组件
- c# - 关于简化功能的建议
- api - 使用 Admin API 的 Shopify 订单状态
- javascript - 在 setState() 触发之前,放大器状态一直被忽略
- java - 无法更新 NaturalId 字段值:实体 {Model} 的不可变自然标识符已从 ABC 更改为 XYZ
- java - java中的CPU核心和线程关系
- java - Kotlin 中有多平台锁吗?
- android - 在 ContentProvider 中获取 WorkManager 实例