strразделить точкой и подчеркнуть и вставить данные в два столбца

У меня есть список набора данных в соответствии с приведенным ниже примером

Match1
data.events.Brisbane.Broncos_Parramatta.Eels.sites.sportsbet.h2h 
data.events.Melbourne.Storm_North.Queensland.Cowboys.sites.sportsbet.h2h

Я хочу, чтобы конечные результаты были

Team 1            Team 2
Brisbane Broncos  Parramatta Eels
Melbourne Storm   North Queensland

Я пытался разделить и вставить, но на самом деле не работает, пожалуйста, помогите!

ThisWee$Match1 <- unlist(strsplit(ThisWeek$Match1, "_", "\\."))
paste(ThisWeek$Match1[3], ThisWeek$Match1[4])

person Jun Edward Shin    schedule 22.05.2018    source источник


Ответы (2)


Еще одно решение с использованием dplyr, tidyr и stringr:

library(dplyr)
library(tidyr)
library(stringr)

df %>% 
  separate(Match1, c("Team1", "Team2"), "_") %>% 
  mutate_all(str_replace_all, "\\.", " ") %>% 
  mutate(Team1 = word(Team1, 3, 4),
         Team2 = word(Team2, 1, 2))
             Team1            Team2
1 Brisbane Broncos  Parramatta Eels
2  Melbourne Storm North Queensland

Данные:

Lines <- "Match1
data.events.Brisbane.Broncos_Parramatta.Eels.sites.sportsbet.h2h 
data.events.Melbourne.Storm_North.Queensland.Cowboys.sites.sportsbet.h2h"

df <- read.table(text = Lines, header = TRUE, stringsAsFactors = FALSE)
person tyluRp    schedule 22.05.2018

Два возможных решения с использованием пакета data.table:

# load the package and convert 'mydf' to a 'data.table'
library(data.table)
setDT(mydf)

# option 1a:
mydf[, tstrsplit(Match1, '_')
     ][, .(Team1 = trimws(gsub('data|events|\\.',' ',V1)),
           Team2 = trimws(gsub('sites|sportsbet|h2h|\\.',' ',V2)))][]

# option 1b:
mydf[, setNames(tstrsplit(Match1, '_'), paste0('Team',1:2))
     ][, lapply(.SD, function(x) trimws(gsub('data|events|sites|sportsbet|h2h|\\.',' ',x)))][]

# option 2:
mydf[, tstrsplit(Match1, '_')
     ][, .(Team1 = lapply(strsplit(V1, '\\.'), function(x) paste(tail(x, -2), collapse = ' ')),
           Team2 = lapply(strsplit(V2, '\\.'), function(x) paste(head(x, -3), collapse = ' ')))][]

Альтернативное решение в базе R:

l <- strsplit(mydf$Match1, '_')
l <- lapply(l, strsplit, split = '\\.')
l <- lapply(l, function(x) list(paste(tail(x[[1]], -2), collapse = ' '),
                                paste(head(x[[2]], -3), collapse = ' ')))
l <- lapply(l, as.data.frame.list, col.names = paste0('Team',1:2))
do.call(rbind, l)

которые все дают (показан data.table-выход):

              Team1                    Team2
1: Brisbane Broncos          Parramatta Eels
2:  Melbourne Storm North Queensland Cowboys

Используемые данные:

mydf <- structure(list(Match1 = c("data.events.Brisbane.Broncos_Parramatta.Eels.sites.sportsbet.h2h", 
                                  "data.events.Melbourne.Storm_North.Queensland.Cowboys.sites.sportsbet.h2h")),
                  .Names = "Match1", class = "data.frame", row.names = c(NA, -2L))
person Jaap    schedule 22.05.2018
comment
Большое вам спасибо за вашу помощь - person Jun Edward Shin; 25.05.2018