Группировка строк на основе значения столбца и сохранение строки с минимальным значением в R - PullRequest
1 голос
/ 23 марта 2019

В приведенном ниже наборе данных я хочу сначала проверить, какие строки для столбца U и D имеют одинаковое значение.Затем для такого набора строк, имеющих U и V в качестве одного и того же значения, я хочу сохранить ту строку, которая имеет минимальное значение для столбцов Mean, Min и Max.Для данных, которые у меня есть, эти три всегда будут иметь минимальные значения для одной и той же строки из группы строк, где U и 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))

Ожидаемый выход

output <- read.table(header = TRUE, text = "    A   B   C   U   D   E   F   G   H   I   Mean    Min Max
+ 0.18  0.33    Yes ABC-001 ABC B   22000031    0   100 us  37.52111111 33.25   42.12
+ NA    2   Yes PQR-001 PQR B   11200077    -0.1    1.2 V   0.691423506 0.6907286   0.6919283
+ ")

Ответы [ 3 ]

1 голос
/ 23 марта 2019

Вы можете проверить с помощью order и duplicated все с базы 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))
0 голосов
/ 23 марта 2019

Рассмотрите возможность агрегирования, а затем присоединения к исходным данным. Ниже 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
0 голосов
/ 23 марта 2019

Самый чистый способ сделать это будет с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...