【问题标题】:select the row by comparing values in one column in R [duplicate]通过比较R中一列中的值来选择行[重复]
【发布时间】:2019-03-04 15:30:46
【问题描述】:

我有一个看起来像这样的数据框:

n4= 
    sector turb    dist
    1  sector1  T02  828.66
    2  sector1  T04 1114.58
    3  sector1  T05 1012.22
    4  sector2  T03  992.64
    5  sector2  T05 1012.22
    6  sector2  T06 1158.38
    7  sector3  T03  992.64
    8 sector12  T02  828.66
    9 sector12  T04 1114.58

我想保留具有唯一扇区名称的行,并且措施是在 dist 列中保留具有最小值的行:

 sector turb   dist
1  sector1  T02 828.66
4  sector2  T03 992.64
7  sector3  T03 992.64
8 sector12  T02 828.66

我知道我必须根据部门对它们进行分组:

result = n4 %>%
dplyr::group_by(sector)

但后来使用 select 或 filter 命令并没有像我尝试的那样工作:

result = n4 %>%
    dplyr::group_by(sector)%>%
    dplyr::select(which.min(dist))

知道我该怎么做吗?

【问题讨论】:

    标签: r filter group-by dplyr


    【解决方案1】:

    您可以使用filter 代替select 并作为slice 的替代品

    > n4 %>%
        dplyr::group_by(sector)%>%
        dplyr::filter(dist==min(dist))
    # A tibble: 4 x 3
    # Groups:   sector [4]
      sector   turb   dist
      <fct>    <fct> <dbl>
    1 sector1  T02    829.
    2 sector2  T03    993.
    3 sector3  T03    993.
    4 sector12 T02    829.
    

    如果您更喜欢使用 R 基础,请尝试使用 aggregate

    > aggregate(.~sector, data=n4, min)
        sector turb   dist
    1  sector1    1 828.66
    2 sector12    1 828.66
    3  sector2    2 992.64
    4  sector3    2 992.64
    

    您可以check this answer 获取更多替代方案来完成此任务。

    【讨论】:

      【解决方案2】:

      我们需要slice 而不是select 来对行进行子集化。 select 函数是选择数据集的列。如果“扇区”的顺序应与输入数据中“扇区”的出现顺序相同,则将列更改为factor,并在输入数据顺序中指定levels

      n4 %>%       
         dplyr::group_by(sector = factor(sector, levels = unique(sector)))%>%
         dplyr::slice(which.min(dist))
      # A tibble: 4 x 3
      # Groups:   sector [4]
      #  sector   turb   dist
      #  <fct>    <chr> <dbl>
      #1 sector1  T02    829.
      #2 sector2  T03    993.
      #3 sector3  T03    993.
      #4 sector12 T02    829.
      

      或使用base R

      n4[with(n4, ave(dist, sector, FUN = min) == dist),]
      #     sector turb   dist
      #1  sector1  T02 828.66
      #4  sector2  T03 992.64
      #7  sector3  T03 992.64
      #8 sector12  T02 828.66
      

      数据

      n4 <- structure(list(sector = c("sector1", "sector1", "sector1", "sector2", 
      "sector2", "sector2", "sector3", "sector12", "sector12"), turb = c("T02", 
      "T04", "T05", "T03", "T05", "T06", "T03", "T02", "T04"), dist = c(828.66, 
       1114.58, 1012.22, 992.64, 1012.22, 1158.38, 992.64, 828.66, 1114.58
      )), class = "data.frame", row.names = c("1", "2", "3", "4", "5", 
      "6", "7", "8", "9"))
      

      【讨论】:

      • 谢谢您的回复,但是这里扇区列的排序更改为:sector1, sector12, sector2, sector3,我该如何解决?
      • @AliHadjihoseini 一种选择是将其转换为factor 列并指定levels。更新了帖子
      猜你喜欢
      • 1970-01-01
      • 2019-10-17
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多