【问题标题】:Subset data based on Minimum Value基于最小值的子集数据
【发布时间】:2015-11-29 09:37:47
【问题描述】:

这可能很简单。这是数据:

dat <- read.table(header=TRUE, text="
Seg  ID  Distance
Seg46      V21 160.37672
Seg72      V85 191.24400
Seg373      V85 167.38930
Seg159     V147  14.74852
Seg233     V171 193.01636
Seg234     V171 200.21458

                   ")
dat
Seg  ID  Distance
Seg46      V21 160.37672
Seg72      V85 191.24400
Seg373      V85 167.38930
Seg159     V147  14.74852
Seg233     V171 193.01636
Seg234     V171 200.21458

我打算得到一个像下面这样的表格,它将给我Seg 以最小化距离(在ID 中可以看到重复。

Seg Crash_ID  Distance
Seg46      V21 160.37672
Seg373      V85 167.38930
Seg159     V147  14.74852
Seg233     V171 193.01636

我正在尝试使用ddply 来解决它;但它没有到达那里。

ddply(dat, "Seg", summarize, min = min(Distance))
Seg       min
Seg159  14.74852
Seg233 193.01636
Seg234 200.21458
Seg373 167.38930
Seg46 160.37672
Seg72 191.24400

【问题讨论】:

    标签: r subset dplyr plyr


    【解决方案1】:

    如果你更喜欢ddply,你可以这样做

    library(plyr)
    ddply(dat, .(ID), summarize, 
          Seg = Seg[which.min(Distance)], 
          Distance = min(Distance))
    
    #    ID    Seg  Distance
    #1 V147 Seg159  14.74852
    #2 V171 Seg233 193.01636
    #3  V21  Seg46 160.37672
    #4  V85 Seg373 167.38930
    

    【讨论】:

      【解决方案2】:

      我们可以使用which.min 对行进行子集化。用'ID'分组后,我们slice根据最小'Distance'位置的行。

      library(dplyr)
      dat %>% 
         group_by(ID) %>% 
         slice(which.min(Distance))
      

      使用data.table 的类似选项是

      library(data.table)
      setDT(dat)[, .SD[which.min(Distance)], by = ID]
      

      【讨论】:

        猜你喜欢
        • 2021-09-25
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多