【问题标题】:comparing vectors both by value and order按值和顺序比较向量
【发布时间】:2012-08-08 01:43:47
【问题描述】:

我以字符向量的形式提取了一些棒球击球阵容 例如

[1] "Yunel Escobar"     "Kelly Johnson"     "Jose Bautista"     "Adam Lind"        
[5] "Edwin Encarnacion" "Brett Lawrie"      "Eric Thames"       "Colby Rasmus"     
[9] "Jeff Mathis"

并在 R 中创建了一个数据框 allLineups,其中列出了 162 场比赛赛季中每场比赛的击球顺序

头(所有阵容)

player          order game
 Yunel Escobar     1    1
 Kelly Johnson     2    1
 Jose Bautista     3    1
 Adam Lind         4    1
 Edwin Encarnacion 5    1
 Brett Lawrie      6    1

我现在想做一些分析,包括以下内容

a) 在本赛季中,任何特定的 9 名球员在击球阵容中的频率是多少

b) 完全相同的阵容(包括顺序)出现多少次

c) 两个指定玩家一起出现的频率

d) 对于任何指定的游戏,它的阵容与第一场比赛的阵容相比如何

我会很感激一些关于如何回答这些问题的指导

【问题讨论】:

  • 看包plyr.
  • 你能不能说得更具体一点。我已经使用了 plyr 来总结一下一个球员在阵容中以特定顺序打了多少次,例如团队和赛季我会使用它,但无法了解如何将其应用于我正在研究的问题
  • @csgillespie。好吧,如果我只有几个字符向量,例如lineup1 和 lineup2 然后 setdiff 函数可能很有用,但我不确定如何在数据帧中得到它

标签: r vector comparison


【解决方案1】:

添加sort 调用以交付 OP 在下面的评论中请求的内容;

player <- c("Yunel Escobar"  ,   "Kelly Johnson"  ,   "Jose Bautista"   ,  "Adam Lind"   ,     
"Edwin Encarnacion", "Brett Lawrie"   ,   "Eric Thames"   ,    "Colby Rasmus"    , 
"Jeff Mathis")

# create two games with different lineups
allLineups <- data.frame(player=c(player, rev(player)) , order=1:9, game=rep(1:2, each=9))

#construct a lineup
with(allLineups, tapply(player, game, function(x) paste0(sort(x), collapse="/") ) )

# tabulate the values for lineups
table( with(allLineups, tapply(player, game, function(x) paste0(sort(x), collapse="/") ) ) )

您可以通过以下方式缩短阵容列表:

allLineups$shortplyr <- sub("^(.).+\\ (.{4}).*$", '\\1_\\2', allLineups$player)
# ------------
table( with(allLineups, tapply(shortplyr, game, function(x) paste0(sort(x), collapse="/") ) ) )

A_Lind/B_Lawr/C_Rasm/E_Enca/E_Tham/J_Baut/J_Math/K_John/Y_Esco 
                                                             2 

而且 OP 显然不想要这个。:

如果阵容没有排序,你应该排序:

allLineups <- with( allLinups, allLineups[ order(game, order) , ]

【讨论】:

  • 谢谢。据我了解,这确实允许我汇总完全相同的阵容,即上面的 b)。在您的示例中,这将是每个 1。
  • 但是,查看相同的 9 名球员何时出现但以不同的顺序击球似乎无济于事 - 在您的示例中,此查询的两个阵容应该相同。我想可能有另一种方法可以得到这个(连接名称的长度可能会捕获大多数结果,但不是 100% 肯定),但我当然希望 R 提出一个更优雅的解决方案
  • 然后更好地定义问题和所需的解决方案。如果您想要阵容而不考虑击球“顺序”,您需要做的就是明确这一方面。我们将按名称排序,然后排列将被视为相同的“阵容”。正如 Jim Holtman 的标语所说““你想解决什么问题?”(你应该通过编辑你的问题来澄清这一点,而不是在 cmets 中。)
  • 对我来说 b) 带有短语 ...“完全相同的阵容(包括订单)”的项目意味着将不同的订单视为不同的“阵容”。
  • 感谢按名称排序为我提供了替代表,我现在取得了一些进展,以便我可以使用 setdiff 将特定阵容与第一季、最常见等进行比较。
猜你喜欢
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 2013-02-09
  • 2013-08-05
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多