Группировать по столбцам, сохранять минимальное значение, связывать выбранные значения - PullRequest
0 голосов
/ 25 января 2019

У меня есть фрейм данных, который выглядит следующим образом:

new_df <- structure(list(intype = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A30", 
    "A31"), class = "factor"), inerror = c(0.54, 0.14, 0.94, 0, 2.11, 
    0), inmethod = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", 
    "B", "C"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -6L))

Я хотел бы создать новый фрейм данных, который будет хранить только лучший метод с минимальной ошибкой, но для связей я хотел бы объединить лучшие методы. Результирующий фрейм данных должен выглядеть следующим образом:

+--------+---------+----------+
| intype | inerror | inmethod |
+--------+---------+----------+
| A30    |    0.14 |        B |
| A31    |    0.00 |      A,C |
+--------+---------+----------+

В настоящее время я использую

require(plyr)
new_df[new_df$inerror == ddply(new_df, .(intype), summarise, Value = min(inerror))$Value,]

Но это не работает.

Ответы [ 5 ]

0 голосов
/ 25 января 2019

Не элегантный ответ, но с использованием data.table

df <- data.table(df)
df <- df[df[,.(inerror == min(inerror)), .(intype)]$V1]
df <- df[, inmethod := toString(inmethod), .(intype)]
df <- unique(df)
df

   intype inerror inmethod
1:    A30    0.14        B
2:    A31    0.00     A, C
0 голосов
/ 25 января 2019

Просто для полноты решения Base R:

do.call(rbind, lapply(split(new_df, new_df$intype),  function(x) {
  x <- x[x$inerror == min(x$inerror), ]
  data.frame(intype = x$intype[1], 
             inerror = x$inerror[1], 
             inmethod = paste0(x$inmethod, collapse = ","))
}))
0 голосов
/ 25 января 2019

Используя data.table, вы можете сделать следующее:

library(data.table)
setDT(new_df)[, paste(inmethod[inerror==min(inerror)], collapse=", "), by=.(intype)]
0 голосов
/ 25 января 2019

Другое решение tidyverse, немного отличающееся от решения Шри:

df %>%
  group_by(intype, inerror) %>%
  summarise(inmethod = toString(inmethod)) %>%
  arrange(intype, inerror) %>%
  distinct(intype, .keep_all = T)

# A tibble: 2 x 3
# Groups:   intype [2]
  intype inerror inmethod
  <fct>    <dbl> <chr>   
1 A30       0.14 B       
2 A31       0    A, C    
0 голосов
/ 25 января 2019

Вот один из способов использования dplyr -

new_df %>% 
  group_by(intype) %>% 
  filter(inerror == min(inerror)) %>% 
  group_by(intype, inerror) %>% 
  summarise(inmethod = toString(inmethod)) %>% 
  ungroup()

# A tibble: 2 x 3
intype inerror inmethod
<chr>    <dbl> <chr>   
1 A30       0.14 B       
2 A31       0    A, C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...