我有一个数据集,其中包含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的新手,所以我只是在寻找最有效的方法。
发布于 2018-10-24 22:14:28
您可以添加字段的一列,排序。例如:
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应用于数据x的每一行(1);更改1到2,它将应用于每一列;在本例中,FUN被调用4次,对每一行调用一次,并使用值的向量;sort(v)确保玩家的ID(或姓名?)总是按可预测的顺序排列;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 3https://stackoverflow.com/questions/52978406
复制相似问题