我确实有许多序列,其中包含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的某些功能,但甚至无法成功。有人可以帮我吗?
这里是三个解决方案的时间。
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'
")