【问题标题】:how to subset a data for each id in a dataframe based on multiple conditions using R [duplicate]如何使用R基于多个条件为数据帧中的每个ID子集数据
【发布时间】:2020-11-07 03:55:11
【问题描述】:

我有一个包含 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)), ]
 })

但未能获得所需的输出

【问题讨论】:

    标签: r database dataframe data-manipulation


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      【解决方案2】:

      这是一个基本的 R 解决方案

      abcd <- do.call(rbind,c(lapply(split(abc,abc$ID),function(x) x[which.min(x$C):which.min(x$B),]),make.row.names = FALSE))
      

      【讨论】:

        猜你喜欢
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        • 2019-06-01
        • 2018-12-06
        • 2016-03-19
        相关资源
        最近更新 更多