Как объединить два разных столбца с двумя разными функциями в R-кадре данных - PullRequest
1 голос
/ 02 февраля 2020

У меня есть фрейм данных, в котором есть несколько дублированных записей, и мне нужно объединить дубликаты, чтобы в каждой строке была уникальная запись.

Пример:

Col1    Col2    Col3    Col4
A       0.170   83     0.878
B       0.939   103    0.869
C       0.228   80     0.935
D       0.566   169    0.851
D       0.566   137    0.588
E       0.703   103    0.636

I нужно взвесить среднее значение Col4 с Col3, а сумму Col3. Таким образом, мой результат будет:

Col1    Col2    Col3    Col4
A      0.17     83     0.878
B      0.939    103    0.869
C      0.228    80     0.935
D      0.566    306    0.733
E      0.703    103    0.636

Обычно я использую агрегатную функцию, но не могу найти решение, включающее два разных типа функций. Есть ли другой способ сделать это? Я фактически игнорирую Колонку 2, поскольку степень детализации до слияния с данными, которые вводили Кол3 и Кол4, составляла одну запись на строку, и теперь она дублируется.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 февраля 2020

Используя dplyr, вы можете использовать group_by, чтобы сохранить все уникальные строки "Col1", а затем передать все свои различные функции в summarise. С вашим примером это может быть что-то подобное.

Примечание: для вычисления weighted.mean Col4 по Col3, вам нужно пройти эту функцию перед вычислением sum из Col3, в противном случае длина Col4 и Col3 будет отличаться.

Вы можете затем реорганизуйте ваш фрейм данных в правильном порядке, используя select:

library(dplyr)
df %>% group_by(Col1) %>%
  summarise(Col2 = mean(Col2),
            Col4 = weighted.mean(Col4,Col3),
            Col3 = sum(Col3)) %>%
  select(Col1,Col2,Col3,Col4)

# A tibble: 5 x 4
  Col1   Col2  Col3  Col4
  <chr> <dbl> <int> <dbl>
1 A     0.17     83 0.878
2 B     0.939   103 0.869
3 C     0.228    80 0.935
4 D     0.566   306 0.733
5 E     0.703   103 0.636

Данные

structure(list(Col1 = c("A", "B", "C", "D", "D", "E"), Col2 = c(0.17, 
0.939, 0.228, 0.566, 0.566, 0.703), Col3 = c(83L, 103L, 80L, 
169L, 137L, 103L), Col4 = c(0.878, 0.869, 0.935, 0.851, 0.588, 
0.636)), row.names = c(NA, -6L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x561706072cc0>)
2 голосов
/ 02 февраля 2020

Решение Base R:

aggregated_df <- data.frame(do.call("rbind", lapply(split(df, df$Col1), function(x){
        list(Col1 = unique(x$Col1), Col2 = mean(x$Col2), Col3 = sum(x$Col3), 
                   Col4 = weighted.mean(x$Col4, x$Col3))
      }
    )
  ),
stringsAsFactors = FALSE)

Данные:

df <-
  structure(
    list(
      Col1 = c("A", "B", "C", "D", "D", "E"),
      Col2 = c(0.17,
               0.939, 0.228, 0.566, 0.566, 0.703),
      Col3 = c(83L, 103L, 80L,
               169L, 137L, 103L),
      Col4 = c(0.878, 0.869, 0.935, 0.851, 0.588,
               0.636)
    ),
    row.names = c(NA,-6L),
    class = c("data.frame"
    ))
...