Вы можете добавить столбец полей, отсортированных.Например:
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