从混合字符串中的字母中拆分数字,并使用R中的Regex将其放入列中

时间:2018-03-04 07:23:54

标签: r regex dplyr

我有一系列篮球运动员统计数据,如下例所示:

stats <- c("40pt 2rb 1as 2st 2to 4trey 11-20fg 14-14ft",
           "7pt 5rb 1as 2st 1bl 3to 3-5fg 1-4ft",
           "0pt 1rb 1as 0-2fg")

理想情况下,我想将此字符串转换为表格格式:

stats table

这是每列的关键:

  • pt = points
  • rb = rebounds
  • as = assists
  • st = steals
  • bl = blocks
  • 来=失误
  • trey = 3个指针
  • fg =已尝试的字段目标
  • ft =免费投掷尝试

1 个答案:

答案 0 :(得分:1)

我们在字母和数字之间的边界处拆分字符串以创建list(&#39; lst&#39;),循环遍历list,将其更改为data.frame使用备用拆分值中的列名称,使用rbindlist对元素进行rbind,将具有-的元素拆分为具有cSplit的多个列,并将NA值转换为0

library(data.table)
library(splitstackshape)
lst <- strsplit(stats, "(?<=[0-9])(?=[a-z])|\\s+", perl = TRUE)
lst1 <- lapply(lst, function(x) 
         as.data.frame.list(setNames(x[c(TRUE, FALSE)], x[c(FALSE, TRUE)])))
res <- cSplit(rbindlist(lst1, fill = TRUE), c('fg', 'ft'), '-')
for(nm in seq_along(res)){
    set(res, i = NULL, j = nm, value = as.numeric(as.character(res[[nm]])))
    set(res, i = which(is.na(res[[nm]])), j = nm, value = 0)
}

res
#    pt rb as st to trey bl fg_1 fg_2 ft_1 ft_2
#1: 40  2  1  2  2    4  0   11   20   14   14
#2:  7  5  1  2  3    0  1    3    5    1    4
#3:  0  1  1  0  0    0  0    0    2    0    0