正在寻找一个R函数,它允许我根据5列中的匹配值汇总df中的数据
我有一个包含NBA比赛日志数据的数据集。每一行都有关于一场比赛的数据,其中包括10列,显示当时每个队的球员。这些列标记为A1、A2、A3、A4、A5和H1、H2、H3、H4、H5 使用R,我想根据A1、A2。。。H1,H2。。。柱。问题是,玩家不是在每一行中按相同的顺序分组的。在下面的示例中,我需要总结第1行和第3行,因为它们都包含玩家1、2、3、4和5,只是顺序不同:正在寻找一个R函数,它允许我根据5列中的匹配值汇总df中的数据,r,R,我有一个包含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 ----|----|----|----|----|--
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新手,所以我只是在寻找最有效的方法 您可以添加一列已排序的字段。例如:
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
仅供参考:如果数据采用更易于使用的格式,这将非常有帮助。示例包括:1以编程方式构建数据,例如使用data.frame,但并不总是美观;2与您的答案相同,但没有管道和破折号,请参阅我答案的文本部分;3组合:以编程方式与read.table或类似文件结合,使用直观的简单格式;或dputx或dputheadx的4个输出(如果较大)。第三种方法适用于这样的小数据集。如果数据中嵌入了空格,则可能无法使用,因此请替换空格或选择第四个选项。
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