Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

用R分析光荣《三国志》系列人物数据

0
0
前言

写这篇文章有两个原因,第一个是最近在看吴秀波演的《军师联盟》,这部剧剧情紧凑,演员演技精湛,有很多令人惊艳的细节, 再一次勾起了我对三国的兴趣。从小到大玩过不少三国游戏,看过很多三国的书,电视剧如央视版三国,高希希版新三国也都不在话下,而这些年除了偶尔玩玩《三国志10》并没有再对三国有什么研究, 想通过这个分析再重温下三国里的那些人物和故事。第二个原因是自己有比较长一段时间没怎么写R, 工作上用到R的机会也不是很多,手有点生,打算用这个数据练练手,加之这是个中文数据,以前没有过用R处理中文数据的经验。

人物数值系统一直是光荣历史游戏的一个特点,它是光荣结合史实,小说,野史等资料对人物的一个全面评价。光荣公司的《三国志》系列可以说是最经典的三国游戏,从1985年第一代推出以来,到现在已经有了十三代作品。而每代出场的数百个武将,经过这么多个版本,他们的各项属性是否会有什么大的变化呢,而这些变化反映了什么呢,这也是这次分析主要想研究的。

我用的武将数据是一个台湾网友(cws0324@yahoo.com.tw)收集制作的,它包含了三国志 1-11 所有的武将数据。给人物以数值化好处自然不言而喻,它可以让我们对游戏中武将的强弱有个直观的了解,但坏处就是我们有时候只看重数值,而忽略了该人物在历史上真实的一面,这问题在日本战国人物里更严重些。E.g. 伊达政宗,竹中半兵卫。想研究的话请参考

为什么日本战国时期有很多名将? (第一个回答把我笑死了)

国内非专业圈中(民科?)日本战国时代历史学习的氛围和现状有感

马伯庸在知乎一个问题的回答里做过类似的分析,他用的工具是Excel, 有兴趣的可以去看看. 光荣公司《三国志》游戏里的武将设定,是按照三国历史设计的吗?

我还用该数据+shiny做了一个三国志人物数据查询工具, https://nathanpan.shinyapps.io/RoTC-Searching/

由于自己也是对演义了解的更多,所以分析的时候更多会以演义的角度,再结合史实。话不说多,开始我们的分析。

1. 数据处理 首先看下这份数据本身的格式。
用R分析光荣《三国志》系列人物数据

我们发现有多个相同的变量分部在不同的列,而且版本信息占据了多个格子。这种数据不手动处理很难读进R(可能可以?),在excel里也许能直接用,但在R里这不属于我们所说的 干净数据 。干净数据有如下定义

每一个变量必须有它自己的列 每一个样本必须有它自己的行 每一个数值必须在它自己的格子 我决定自己手动把版本数据分开到11个表格里,每一个如下图所示。(自然我也可以手动直接得到我们最终想要的数据,但我还是决定用R实现它。)
用R分析光荣《三国志》系列人物数据

初步处理过后的数据我放到了 这里

这些是我们需要用到的package.

library(readxl) library(dplyr) library(data.table) library(ggplot2)

为了能在R里使用中文,我们用下面的代码将系统locale设置为”Chs”, 这里用的操作系统是Win10家庭版。

Sys.setlocale('LC_ALL','Chs')

接着用 readxl::read_excel 读取数据,每一个版本的数据分别存在了1个data frame里,我们总共有11个data frame,而这11个data frame又都再存在一个list里,因为 lapply 返回的就是list结构,我们给它命名为 dt .

dt <- lapply(1:11, function(x) read_excel("Characters.xlsx", x))

由于每一代武将所拥有的属性不一样,为了后边方便,我希望能做一个大的data frame,它的变量有姓名,所有版本的属性以及该人物出场的版本。下面我们来看如何达到这个目的。

我先把每一个版本的数据移除不需要的变量和那一个版本没有出现过的武将,部分NPC各项属性全都为0,我们也将它去掉,把清理过后的数据存到一个新的变量里,叫做 series 。

# Column 2-8 为不需要的变量 series <- lapply(1:11, function(x) {select(dt[[x]], -c(2:8)) %>% filter(complete.cases(dt[[x]][,-c(2:8)])) %>% mutate(版本 = paste0("三W志", x)) %>% filter(智力!= 0) }) # 通常一项属性为0,其它属性也都为0

第一代前六个武将是如下几位。

head(series[[1]]) # A tibble: 6 x 7 姓名

Viewing all articles
Browse latest Browse all 12749

Latest Images

Trending Articles





Latest Images