首页 > 解决方案 > 如何使用 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)), ]
 })

但未能获得所需的输出

标签: rdatabasedataframedata-manipulation

解决方案


您可以使用which.min获取CB列的最小值,并在它们之间创建一个序列以在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

推荐阅读