首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找一个R函数,它将允许我根据5列中的匹配值来总结df中的数据

寻找一个R函数,它将允许我根据5列中的匹配值来总结df中的数据
EN

Stack Overflow用户
提问于 2018-10-24 21:52:06
回答 1查看 37关注 0票数 0

我有一个数据集,其中包含NBA比赛的游戏日志数据。每行都有关于一场比赛的数据,其中包括10列,显示当时来自每支球队的球员。这些列被标记为A1、A2、A3、A4、A5和H1、H2、H3、H4、H5。

使用R,我想总结各种基于匹配组球员在A1,A2.H1,H2.列。问题是,球员们并不是在每一行都是按相同的顺序分组的。在下面的示例中,我需要总结第1行和第3行,因为这两行都包含播放器1、2、3、4和5,只是顺序不同:

代码语言:javascript
复制
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的新手,所以我只是在寻找最有效的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-24 22:14:28

您可以添加字段的一列,排序。例如:

代码语言:javascript
复制
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列可能是确保不同行具有完全相同的播放器的最清晰的方法,而不管它们在列中的位置如何。它并不是为了“美丽”,只是有用。如果您生成了一个类似的报告字段,它看起来更好看,而且同样具有可预测的顺序(谁知道呢?),那么它也可以工作。

现在您可以对此进行分组,如下所示:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52978406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档