根据列值对行进行分组,并使行的最小值保持在R中

时间:2019-03-23 00:01:05

标签: r dataframe

在下面的数据集中,我想首先检查列UD的哪些行具有相同的值。然后,对于具有UV作为相同值的此类行,我想保留该行,该行的最小值为列MeanMin和{{1 }}。对于我拥有的数据,在MaxU匹配的一组行中,这三个行中的同一行始终具有最小值。

我尝试了V函数,但是没有按我的要求输出。请提出任何有效的方法。

输入数据

group()

预期的运气量

data <- structure(list(A = c(0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 0.18, 
0.18, NA, NA, NA, NA, NA, NA), B = c(0.33, 0.33, 0.33, 0.33, 
0.33, 0.33, 0.33, 0.33, 1, 2, 2, 2, 3, 4), C = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Yes", class = "factor"), 
    U = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L, 2L, 2L), .Label = c("ABC-001", "PQR-001"), class = "factor"), 
    D = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L, 2L, 2L), .Label = c("ABC", "PQR"), class = "factor"), 
    E = structure(c(1L, 2L, 3L, 4L, 4L, 5L, 5L, 6L, 1L, 1L, 2L, 
    2L, 3L, 3L), .Label = c("A", "B", "C", "D", "E", "F"), class = "factor"), 
    F = c(22000014L, 22000031L, 22000033L, 22000025L, 22000028L, 
    22000020L, 22000021L, 22000015L, 11100076L, 11200076L, 11100077L, 
    11200077L, 11100078L, 11200078L), G = c(0, 0, 0, 0, 0, 0, 
    0, 0, -0.1, -0.1, -0.1, -0.1, 0.2, 0.2), H = c(100, 100, 
    100, 100, 100, 100, 100, 100, 1.2, 1.2, 1.2, 1.2, 0.9, 0.9
    ), I = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L), .Label = c("us", "V"), class = "factor"), 
    Mean = c(38.72, 37.52111111, 38.44166667, 39.23666667, 39.35888889, 
    38.96, 38.95333333, 38.41777778, 0.691707061, 0.691554561, 
    0.691516833, 0.691423506, 0.763736, 0.764015761), Min = c(34.05, 
    33.25, 33.31, 35.14, 33.91, 33.78, 33.78, 33.75, 0.6911166, 
    0.6908743, 0.6908813, 0.6907286, 0.7609318, 0.7616949), Max = c(43.83, 
    42.12, 43.57, 44.03, 44.88, 44.03, 44.02, 43.52, 0.692533, 
    0.6922278, 0.6923681, 0.6919283, 0.7674736, 0.7668633)), class = "data.frame", row.names = c(NA, 
-14L))

3 个答案:

答案 0 :(得分:1)

您可以使用orderduplicated来检查基础R

data = data[order(data$Mean),]
output = data[!duplicated(data[c("U","D")]),]
output
      A    B   C       U   D E        F    G     H  I       Mean        Min        Max
12   NA 2.00 Yes PQR-001 PQR B 11200077 -0.1   1.2  V  0.6914235  0.6907286  0.6919283
2  0.18 0.33 Yes ABC-001 ABC B 22000031  0.0 100.0 us 37.5211111 33.2500000 42.1200000

如果您想要dplyr

library(dplyr)
data %>% group_by(U, D) %>% slice(which.min(Mean))

答案 1 :(得分:0)

最干净的方法是使用dplyr

library(dplyr)
data %>% group_by(U, D) %>% filter(Mean == min(Mean))

输出看起来像这样

      A     B C     U       D     E            F     G     H I       Mean    Min    Max
  <dbl> <dbl> <fct> <fct>   <fct> <fct>    <int> <dbl> <dbl> <fct>  <dbl>  <dbl>  <dbl>
1  0.18  0.33 Yes   ABC-001 ABC   B     22000031   0   100   us    37.5   33.2   42.1  
2 NA     2    Yes   PQR-001 PQR   B     11200077  -0.1   1.2 V      0.691  0.691  0.692

答案 2 :(得分:0)

请考虑进行汇总,然后再合并回原始数据。 names()下面的内容用于对列进行重新排序,merge省略了by,因为聚合结果集中的所有列都将匹配:

agg_df <- aggregate(cbind(Mean, Min, Max) ~ U + D, data, FUN=min)

merge(data, agg_df)[names(data)]
#      A    B   C       U   D E        F    G     H  I       Mean        Min        Max
# 1 0.18 0.33 Yes ABC-001 ABC B 22000031  0.0 100.0 us 37.5211111 33.2500000 42.1200000
# 2   NA 2.00 Yes PQR-001 PQR B 11200077 -0.1   1.2  V  0.6914235  0.6907286  0.6919283