使用 R 为字符串中的字母模式赋值

Assigning values to patterns of letters in character strings using R

我有一个如下所示的数据框:

head(df)

   shotchart
1 BMMMBMMBMMBM
2 MMMBBMMBBMMB
3 BBBBMMBMMMBB
4 MMMMBBMMBBMM

字母 'M' 的不同模式对应某些值,例如:

MM = 1 MMM = 2 MMMM = 3

我想为此数据框创建一个额外的列,用于单独计算每行中 'M' 的不同模式的总值。

例如:

head(df)

   shotchart           score
1 BMMMBMMBMMBM           4
2 MMMBBMMBBMMB           4
3 BBBBMMBMMMBB           3
4 MMMMBBMMBBMM           5

我似乎无法弄清楚如何将值分配给不同的 'M' 模式。

我尝试使用以下代码,但没有成功:

df$score <- revalue(df$scorechart, c("MM"="1", "MMM"="2", "MMMM"="3"))

我们创建一个命名向量('nm1'),split 'shotchart' 仅提取 'M' 然后使用命名向量更改值以获得sum

nm1 <- setNames(1:3, strrep("M", 2:4))
sapply(strsplit(gsub("[^M]+", ",", df$shotchart), ","), 
         function(x) sum(nm1[x[nzchar(x)]], na.rm = TRUE))

或使用tidyverse

library(tidyverse)
df %>%
    mutate(score = str_extract_all(shotchart, "M+") %>% 
                        map_dbl(~ nm1[.x] %>% 
                                    sum(., na.rm = TRUE)))
#      shotchart score
#1 BMMMBMMBMMBM     4
#2 MMMBBMMBBMMB     4
#3 BBBBMMBMMMBB     3
#4 MMMMBBMMBBMM     5

您还可以拆分 "B" 并根据 "M" 个字符 -1 的计数得出结果,如下所示:

df <- data.frame(shotchart = c("BMMMBMMBMMBM", "MMMBBMMBBMMB", "BBBBMMBMMMBB", "MMMMBBMMBBMM"),
                 score = NA_integer_,
                 stringsAsFactors = F)


df$score <- lapply(strsplit(df$shotchart, "B"), function(i) sum((nchar(i)-1)[(nchar(i)-1)>0]))

#     shotchart score
#1 BMMMBMMBMMBM     4
#2 MMMBBMMBBMMB     4
#3 BBBBMMBMMMBB     3
#4 MMMMBBMMBBMM     5