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

时间:2018-07-09 07:57:13

标签: r dataframe character assign

我有一个看起来像这样的数据框:

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"))

2 个答案:

答案 0 :(得分:2)

我们创建一个命名向量('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

答案 1 :(得分:1)

您还可以分割“ 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