通过比较R中一列中的值来选择行

时间:2018-09-28 15:37:53

标签: r filter group-by dplyr

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

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))

任何想法我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以使用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 base,请尝试使用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获得完成此任务的其他选择。

答案 1 :(得分:2)

我们需要module.exports = { extend: 'teaser-widgets', label: 'Simple Teaser' }; 而不是slice来对行进行子集化。 select函数用于选择数据集的列。如果“扇区”的顺序应与输入数据中“扇区”的出现顺序相同,则将该列更改为在输入数据顺序中指定了select的{​​{1}} < / p>

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