字符减法和循环

问题描述 投票:-1回答:1

我确实有许多序列,其中包含0,1,并且将其作为字符导入R。 seq如下所示:

'1000000000000000000010000100'
'1000000000001000000010100100'
'0001010100010000110000010000'
'0011010100010000100000010000'
'0101000100010000100100011010'
'0001000100010000101000010011'
'0101000100010000100000011010'
'0001000100010000101000010011'
'0101000100010100100000011010'
'0101000100010000100000011010'
'0001000101010000101000010011'
'0001000100010001100001010010'
'0011010100010010100000010000'
'0001000100010000101000010011'
'0011010100010000100000010000'
'0001100110110000100000010000'
'1000001000000000000010000100'
'0011010100010000100000010000'
'1000001000000000000010000100'
'0011010100010000100000010000'

我确实有超过10000行。我应该编写一个循环,通过使用这些序列,该循环的作用就像彼此随机相减。例如:第一行和第二行的减法等于2(3(sum('1000000000000000000010000100'))-5(sum('1000000000001000000010100100'))= -2)。我应该将每个序列的0,1相加,然后找出它们之间的差异。这是一个反复的过程,例如,如果序列号为20,我应该写一个运行10 * 19 ^ 20的循环,即使只有20,也非常大。是否有可能在r中写入它?什么是最有效的循环?由于性格,我什至不能减去序列。我已经尝试过r的某些功能,但甚至无法成功。有人可以帮我吗?

r for-loop character-encoding sequence factory-pattern
1个回答
0
投票

这里是三个解决方案的时间。

library(microbenchmark)

mb <- microbenchmark(
  base = nchar(gsub("[^1]", "", x)),
  regex = stringi::stri_count_regex(x, "1"),
  fixed = stringi::stri_count_fixed(x, "1")
)
print(mb, order = "median")
#Unit: microseconds
#  expr    min      lq      mean median       uq     max neval cld
# fixed 16.718 18.3280  21.87835 21.857  22.7910  87.749   100 a  
# regex 42.043 44.8150  47.81715 46.114  48.9115  91.488   100  b 
#  base 87.136 91.7735 100.39151 95.505 109.1465 163.477   100   c

因此,在我的系统上(在Ubuntu 19.04上为R 3.6.1),程序包stringi函数stri_count_fixed比基本R nchar/gsub快4倍。

一个调用该解决方案的函数可能是]

sumOnes <- function(x) stringi::stri_count_fixed(x, "1")

sumOnes(x)
#[1] 3 5 7 7 9 8 8 8 9 8 9 8 8 8 7 8 4 7 4 7

数据。

x <- scan(what = character(), text = "
'1000000000000000000010000100'
'1000000000001000000010100100'
'0001010100010000110000010000'
'0011010100010000100000010000'
'0101000100010000100100011010'
'0001000100010000101000010011'
'0101000100010000100000011010'
'0001000100010000101000010011'
'0101000100010100100000011010'
'0101000100010000100000011010'
'0001000101010000101000010011'
'0001000100010001100001010010'
'0011010100010010100000010000'
'0001000100010000101000010011'
'0011010100010000100000010000'
'0001100110110000100000010000'
'1000001000000000000010000100'
'0011010100010000100000010000'
'1000001000000000000010000100'
'0011010100010000100000010000'
")
© www.soinside.com 2019 - 2024. All rights reserved.