我目前在R中有一个字符串,如下所示:
a <- "BMMBMMMMBMMMBMMBBMMM"
首先,我需要确定字符串中出现的“ M”的不同模式的频率。
在此示例中为:
MM = 2
MMM = 2
MMMM = 1
第二,然后我需要为每个不同的模式指定一个数值/分数。
即:
MM = 1
MMM = 2
MMMM = 3
这意味着a
中M的总价值/得分等于9
。
如果有人知道有什么脚本可以让我对数据框中的多个字符串执行此操作,那会很好吗?
谢谢。
答案 0 :(得分:4)
a <- "BMMBMMMMBMMMBMMBBMMM"
tbl <- table(strsplit(a, "B"), exclude="")
tbl
# MM MMM MMMM
# 2 2 1
score <- sum(tbl * 1:3)
score
# 9
答案 1 :(得分:3)
您还可以使用table
函数。
a_list<-unlist(strsplit(a,"B"))
a_list<-a_list[!a_list==""] #remove cases when 2 B are together
a_list<-table(a_list)
# MM MMM MMMM
# 2 2 1
答案 2 :(得分:2)
这是使用-agentlib:jdwp
软件包的解决方案。首先,我加载库并定义我的字符串。
dplyr
接下来,我定义一个函数,该函数计算字符串library(dplyr)
a <- "BMMBMMMMBMMMBMMBBMMM"
中字符x
的出现。
y
然后,我运行该函数。
char_count <- function(x, y){
# Get runs of same character
tmp <- rle(strsplit(y, split = "")[[1]])
# Count runs of character stored in `x`
tmp <- data.frame(table(tmp$lengths[tmp$values == x]))
# Return strings and frequencies
tmp %>%
mutate(String = strrep(x, Var1)) %>%
select(String, Freq)
}
最后,我定义我的值向量并计算向量# Run the function
res <- char_count("M", a)
# String Freq
# 1 M 2
# 2 MM 2
# 3 MMM 1
的总值。
a
答案 3 :(得分:2)
跳过第一步是可以接受的:
nchar(gsub("(B+M)|(^M)","",a))
# [1] 9
答案 4 :(得分:1)
首先计算您的ing中出现的所有不同模式:
a <- "BMMBMMMMBMMMBMMBBMMM"
chars = unlist(strsplit(a, ""))
pat = c()
for ( i in 1:length(chars)){
for (j in 1:(length(chars) - i+1)){ pat = c(pat, paste(chars[j:(j+i-1)], collapse = ""))}}
pat =sort(unique(pat))
pat[1:5] : [1] "B" "BB" "BBM" "BBMM" "BBMMM"
接下来,计算每个模式的出现次数:
counts = sapply(pat, function(w) length(gregexpr(w, a, fixed = TRUE)[[1]]))
最后构建一个不错的数据框以汇总所有内容:
df = data.frame(counts = counts, num = 1:length(pat))
head(df, 10)
counts num
B 6 1
BB 1 2
BBM 1 3
BBMM 1 4
BBMMM 1 5
BM 5 6
BMM 5 7
BMMB 2 8
BMMBB 1 9
BMMBBM 1 10
答案 5 :(得分:0)
library(stringr)
str_count(a, "MMMM")
给出1
str_count(gsub("MMMM", "", a), "MMM") # now count how many times "MMM" occurs, but first delete the "MMMM"
给2
str_count(gsub("MMM", "", a), "MM") #now count how many times "MM" occurs, but first delete the "MMM"'s
给2