当前位置: 首页 > 知识库问答 >
问题:

GSub序列在R中的累积应用

太叔天宇
2023-03-14

我正在做一个关于象棋游戏的项目。在对数据进行一些处理之后,我需要得到一个特定位置的芬(https://en.wikipedia.org/wiki/Forsyth–Edwards_Notation)符号。我已经写好了每块FEN编码的代码,但是我很难对代表未被占据的连续方块的数量的字符进行编码。

例如,以以下FEN代码为例:

"rnbq1rk1/pppp1ppp/1b11pn11/11111111/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"

每个1代表棋盘内一个未被占用的方块。例如:11111111告诉我们棋盘内的这一行没有被棋子占据。

问题是,使用FEN作为输入来绘制棋盘的R包不喜欢这种表示法,它们想要更悬、更原始的表示法,其中所有的< code>1都由一个字符表示:所有这些连续的< code>1的总和。

"rnbq1rk1/pppp1ppp/1b2pn2/8/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w KQkq c6 0 2"

请注意,例如,1111111序列被8替换,所有连续 序列的总和

我曾尝试使用mapplygsub来完成替换,但它一次迭代一个应用模式替换对的字符串。结果如下:

法典:

pattern <- c("11111111","1111111","111111","111111","1111","111","11")
replacement <- c("8","7","6","5","4","3","2")
FENCodeToBeChanged  <-  "rnbq1rk1/pppp1ppp/1b11pn11/11111111/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
mapply(gsub,pattern,replacement,FENCodeToBeChanged)

结果:

                                                                              11111111 
  "rnbq1rk1/pppp1ppp/1b11pn11/8/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2" 
                                                                           1111111 
 "rnbq1rk1/pppp1ppp/1b11pn11/71/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2" 
                                                                            111111 
"rnbq1rk1/pppp1ppp/1b11pn11/611/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2" 
                                                                            111111 
"rnbq1rk1/pppp1ppp/1b11pn11/511/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2" 
                                                                              1111 
       "rnbq1rk1/pppp1ppp/1b11pn11/44/11PP4/41NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2" 
                                                                               111 
   "rnbq1rk1/pppp1ppp/1b11pn11/3311/11PP31/311NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2" 
                                                                                11 
       "rnbq1rk1/pppp1ppp/1b2pn2/2222/2PP22/221NP1/PP2PPBP/RNBQ1RK1 w KQkq c6 0 2"

正如您所看到的,它一次只做一个替换,对于下一个模式替换对,它从原始字符串开始,它不会按照我在模式替换向量中指定的顺序累积它们。

我已经尝试了这里和这里描述的策略,但它们也没有奏效。正如它在最后一个链接中提到的,我试图不惜一切代价避免循环 gsubs 来完成工作,因为它似乎效率很低。

对如何进行有什么想法吗?

谢谢!

共有1个答案

吕俊哲
2023-03-14

m申请的问题是它正在为每个替换查看FEN字符串的新副本,这不是您需要的。我认为您可以使用Reduce心态:

(顺便说一句,你的“5”模式有6个1,这就解决了这个问题。)

pattern <- c("11111111","1111111","111111","11111","1111","111","11")
Reduce(function(txt, ptn) gsub(ptn, as.character(nchar(ptn)), txt), pattern, init=FENCodeToBeChanged)
# [1] "rnbq1rk1/pppp1ppp/1b2pn2/8/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w KQkq c6 0 2"

能够减少多个参数需要一点工作,通常沿着成对列表或类似的列表迭代。有了这个问题,很容易用它的长度替换模式,而不是包含另一个字符串向量ergonchar(ptn)。(从技术上讲,as.character(.)不是必需的,因为gsub会隐式转换它,但我想有点“声明性”,因为这就是我想要的。R中有许多工具以这种方式不太确定(例如,ifelse)。风格。)

 类似资料:
  • 我有两个不同长度的向量,每个向量包含0到50之间的数字。有些数字在向量中不包含,其他数字可能出现多次。 我想画一条线,显示每个数字在每个向量中包含的频率,即数字的频率。 如果我将中断设置为每个可能的数字之间,我可以绘制显示频率的直方图: 我知道有一个经验累积分布函数(),它会形成一个S形;但我想要的是一个非累积的经验分布函数,它将导致类似阶梯形钟形曲线的结果,类似于直方图的轮廓。 我能得到的最接近

  • 问题内容: 我有一个看起来像这样的表: 我想添加一个新的列,称为cumulative_sum,因此表如下所示: 是否有可以轻松完成此操作的MySQL更新语句?做到这一点的最佳方法是什么? 问题答案: 如果性能是一个问题,则可以使用MySQL变量: 或者,您可以删除该列并在每个查询中对其进行计算: 这以运行方式计算运行总和:)

  • 如果我有一个数据框,它有如下列,这里2019Y1-11M代表2019年1月到11月的数据,

  • 问题内容: 我已经实现了一定数量的所有素数的列表。我试图做的事情很难解释,所以我只用一些硬代码展示一下: 所以从本质上讲,我试图从上一个列表中按顺序取出一个元素,然后按指数倍增,然后将其追加到其他列表中。 我意识到我可以做到这一点,这可能会更容易: 我需要一些想法才能在某种程度上做到这一点。 问题答案: 您需要 累积产品 清单。这是一个简单的食谱: 另一种方法,使用itertools: 或者,也许

  • 嗨,我是Spark/Scala的新手,我一直在尝试-AKA失败,根据特定的递归公式在火花数据帧中创建一列: 这里是伪代码。 为了深入了解更多细节,这里是我的出发点:这个数据帧是在和个人级别上聚合的结果。 所有进一步的计算都必须针对特定的,并且必须考虑到前一周发生的事情。 为了说明这一点,我将这些值简化为0和1,删除了乘法器和,并将初始化为零。 到目前为止我所尝试的与所期望的 有没有办法做到这一点与

  • 我想知道为什么需要(又名reduce)第3个参数。对于那些不知道是什么的人,它的用法如下: 调用等同于: 还有可选第4个参数,它允许用任何其他操作替换加法。 我听说的一个基本原理是,如果你不需要加起来,而是乘一个向量的元素,我们需要其他的(非零)初始值: 但是为什么不像Python那样-为设置初始值,并使用从开始的范围。类似这样的事情: 这对任何行动都管用。为什么需要第三个参数?