简单的功能即可计算加1和负1

时间:2019-08-29 15:54:01

标签: r

我正在尝试在r中开发一个非常简单的功能,就是这样;

说我有以下序列"UUDDDDUDU",其中"U" = 1"D" = -1。我要计算以下内容:+1, +1, -1, -1, -1, -1, +1, -1, +1。我得到的最终数字是-1。

funky <- function(n, s){
  current_level = 0
  U = 1
  D = -1
  for(i in 1:n){
    if(s[i] == "U"){current_level +1}
    if(s[i] == "D"){current_level -1}
  }
}

funky(9, UUDDDDUDU)

任何指向正确方向的指针都很棒!

4 个答案:

答案 0 :(得分:6)

您可以使用stringr::str_count

s <- "UUDDDDUDU"
library(stringr)

str_count(s, 'U') - str_count(s, 'D')

# [1] -1

或更笼统

library(purrr)

weights <- c(U = 1L, D = -1L)

sum(imap_int(weights, ~str_count(s, .y)*.x))

# [1] -1

Base R解决方案(使用如上定义的权重和s)

sum(weights[strsplit(s, '')[[1]]])
# [1] -1

答案 1 :(得分:4)

这些方法都在基数R中,并且可以与向量一起使用

x = "UUDDDDUDU"

1

with(data.frame(t(sapply(strsplit(x, ""), table))), U - D)
#[1] -1

2

foo = function(p, s) {
   sapply(gregexpr(p, s), function(x) sum(x > 0))
}
foo("U", x) + (-1 * foo("D", x))
#[1] -1

3

2 * nchar(gsub("D", "", x)) - nchar(x)
#[1] -1

答案 2 :(得分:2)

只是为了好玩(和矢量化)...

s <- c("UUDDDDUDU", "UUDUU", "DDDDDUD")

sapply(parse(text=as.expression(gsub("(.)","\\11",chartr("UD","+-",s)))),eval)

[1] -1  3 -5

这翻译为...

  • U替换为+,并将D替换为-chartr
  • 将每个字符替换为该字符,后跟1gsub
  • 并将这些字符串("+1+1-1-1-1"等)用作表达式

答案 3 :(得分:2)

这是一种利用reticulate

的方法
library(reticulate)
s <- "UUDDDDUDU"
repl_python()
>>> from collections import Counter
>>> sum([a* b for a, b in zip(Counter(list(r.s)).values(), [1, -1])])
#-1