Ищите функцию R, которая позволит мне суммировать данные в df на основе соответствующих значений в 5 столбцах - PullRequest
0 голосов
/ 25 октября 2018

У меня есть набор данных, который содержит данные журнала игр из игр NBA.Каждая строка содержит данные об одной игре, которая включает 10 столбцов, показывающих, кто из каждой команды играл в то время.Эти столбцы помечены A1, A2, A3, A4, A5 и H1, H2, H3, H4, H5.

Используя R, я хочу суммировать различные столбцы на основе сопоставления групп игроков в A1, A2... H1, H2 ... столбцы.Проблема в том, что игроки не группируются в одинаковом порядке в каждом ряду.В следующем примере мне нужно суммировать строки 1 и 3, потому что оба содержат игроков 1, 2, 3, 4 и 5, но не в том же порядке:

Row | A1 | A2 | A3 | A4 | A5 | pts 
----|----|----|----|----|----|-----
1   | p1 | p2 | p3 | p4 | p5 | 2   < row 1 equals row 3
----|----|----|----|----|----|----- 
2   | p2 | p7 | p3 | p4 | p5 | 3 
----|----|----|----|----|----|----- 
3   | p5 | p2 | p3 | p4 | p1 | 1   < row 3 equals row 1
----|----|----|----|----|----|----- 
4   | p6 | p2 | p9 | p4 | p5 | 3

В идеале я хотел быфункция, которая может суммировать эти группы сразу, но я думаю, может быть, мне нужна функция, которая может отсортировать каждую строку сначала по горизонтали.Затем я мог бы создать значение, объединяющее 5 столбцов, и использовать его для суммирования данных (так я делаю это в Excel).

Я новичок в R, поэтому я просто ищу наиболееэффективный подход.

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете добавить столбец полей, отсортированных.Например:

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Row  A1  A2  A3  A4  A5  pts 
1    p1  p2  p3  p4  p5  2
2    p2  p7  p3  p4  p5  3 
3    p5  p2  p3  p4  p1  1
4    p6  p2  p9  p4  p5  3')

dat$sorted <- apply(subset(dat, select=A1:A5), 1, function(v) paste(sort(v), collapse = ","))
dat
#   Row A1 A2 A3 A4 A5 pts         sorted
# 1   1 p1 p2 p3 p4 p5   2 p1,p2,p3,p4,p5
# 2   2 p2 p7 p3 p4 p5   3 p2,p3,p4,p5,p7
# 3   3 p5 p2 p3 p4 p1   1 p1,p2,p3,p4,p5
# 4   4 p6 p2 p9 p4 p5   3 p2,p4,p5,p6,p9

Краткое объяснение:

  • subset(dat, select=...) - это дешевый способ сбора диапазона именованных столбцов;вместо этого можно было бы легко сделать dat[2:6];
  • apply(x, 1, FUN) применяет функцию FUN к каждой строке (1) данных x;измените 1 на 2, и он будет применяться к каждому столбцу;FUN вызывается в этом случае 4 раза, по одному разу для каждой строки, с вектором значений;
  • sort(v) гарантирует, что идентификаторы игроков (или имена?) всегда будут в предсказуемом порядке;
  • paste(..., collapse=",") берет все строки и уплотняет их в одну строку с , между каждой из них.

Так что, возможно, новый столбец sortedСамый ясный способ обеспечить одинаковое количество игроков в разных рядах, независимо от положения в столбцах.Это не предназначено, чтобы быть "красивым", просто полезно.Если у вас есть похожее поле отчетности, которое вы генерируете, которое выглядит лучше и в равной степени предсказуемо (кто знает?), То оно тоже может сработать.

Теперь вы можете сгруппироваться по этому, что-то вроде:

dat$groupavg <- ave(dat$pts, dat$sorted, FUN=mean)
dat$groupsum <- ave(dat$pts, dat$sorted, FUN=sum)
dat
#   Row A1 A2 A3 A4 A5 pts         sorted groupavg groupsum
# 1   1 p1 p2 p3 p4 p5   2 p1,p2,p3,p4,p5      1.5        3
# 2   2 p2 p7 p3 p4 p5   3 p2,p3,p4,p5,p7      3.0        3
# 3   3 p5 p2 p3 p4 p1   1 p1,p2,p3,p4,p5      1.5        3
# 4   4 p6 p2 p9 p4 p5   3 p2,p4,p5,p6,p9      3.0        3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...