我正在尝试在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)
任何指向正确方向的指针都很棒!
答案 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
)1
(gsub
)"+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