【问题标题】:Assigning values to patterns of letters in character strings using R使用 R 为字符串中的字母模式赋值
【发布时间】:2018-07-09 07:57:12
【问题描述】:

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

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

【问题讨论】:

    标签: r dataframe character assign


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您也可以在“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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-09
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2018-09-16
        • 1970-01-01
        • 2015-07-23
        相关资源
        最近更新 更多