我正在嘗試將所有包含在名為“game_info”的 1 列中的一些資料整理為字串。該資料包含大學籃球即將舉行的比賽資料,包括日期、時間、球隊 ID、球隊名稱等。理想情況下,這些資料中的每一項都是他們自己的列。我曾嘗試用空格分隔符分隔,但效果不佳,因為有些團隊,例如“Duke”的名字包含 1 個部分,而團隊的名稱包含 2 到 3 個部分(密歇根州、南達科他州等) )。也有名稱中帶有“-”破折號的球隊。
這是我的資料:
df <- data.frame(list(
game_info = c(
"12/16 7:00 PM 751 Appalachian State 752 Duke",
"12/16 7:00 PM 753 Chicago State 754 Indiana-Purdue",
"12/16 8:00 PM 755 Texas-Arlington 756 Oral Roberts",
"12/16 10:00 PM 757 Dartmouth 758 Stanford"
)
))
期望的輸出:
date time away_team_id away_team_name home_team_id home_team_name
12/16 7:00 PM 751 Appalachian State 752 Duke
12/16 7:00 PM 753 Chicago State 754 Indiana-Purdue
12/16 8:00 PM 755 Texas-Arlington 756 Oral Roberts
12/16 10:00 PM 757 Dartmouth 758 Stanford
@Jonny Phelps @doRemy

uj5u.com熱心網友回復:
一種簡單的方法是使用帶有正則運算式extract的dplyr庫中的 :
# Define the column names:
column_names <- c("date", "time", "away_team_id", "away_team_name", "home_team_id", "home_team_name")
# Define the regex expression:
regex_expr <- paste(
"([0-9]{1,2}[/][0-9]{1,2})", # The date
"([0-9]{1,2}:[0-9]{1,2} [A-Za-z]{2})", # The time
"([0-9] )", # The away team id
"([A-Za-z -] )", # The away team name
"([0-9] )", # The home team id
"([A-Za-z -] )" # The home team name
)
# Extract the columns:
df %>% extract(col = game_info, into = column_names, regex = regex_expr)
uj5u.com熱心網友回復:
這是一個帶有正則運算式的。有關正則運算式說明,請參閱regex101 鏈接
regex <- "^(\\d{2}\\/\\d{2})\\s*(\\d{1,2}:\\d{2}\\s*(PM|AM))\\s*(\\d )\\s*([^\\d.] )(\\d )\\s*([^\\d.] )$"
data <- data.frame(game_info=
"12/16 7:00 PM 751 Appalachian State 752 Duke"
,"12/16 7:00 PM 753 Chicago State 754 Indiana-Purdue"
,"12/16 8:00 PM 755 Texas-Arlington 756 Oral Roberts"
,"12/16 10:00 AM 757 Dartmouth 758 Stanford"
)
library(stringr)
out <- do.call(rbind, str_match_all(data, regex))
out <- as.data.frame(out)
# remove full string & AM/PM
out$V1 <- NULL
out$V4 <- NULL
names(out) <- c("date", "time", "away_team_id", "away_team_name",
"home_team_id", "home_team_name")
# remove white space from end
out$away_team_name <- trimws(out$away_team_name)
out$home_team_name <- trimws(out$home_team_name)
out
解釋:
^(\d{2}/\d{2}) - 以 2 位/2 位數字開頭,如 12/16。^ 是起始錨點, () 用于表示我們要捕獲該組以進行提取
\s* - 我們的第一組和下一組之間有 0 個或多個空格
(\d{1,2}:\d{2}\s*(PM|AM)) - 需要 1 或 2 位數字:2 位數字,然后可能是空格和 PM 或 AM
\s*(\d )\s* - 任意位數周圍的空格,第一個 id
([^\d.] ) - 所有非數字字符。如果您的團隊名稱中有數字,這將下降。如果是這樣,找一些例子,我們可以改進它。之后會捕獲空白,因此稍后會使用 trimws 洗掉
(\d )\s* - 第二個 id 和空格
([^\d.] )$ - 最后是對方隊名和結尾句主播
uj5u.com熱心網友回復:
這是一種替代方法:
library(dplyr)
library(stringr)
library(tidyr)
my_pattern <- "\\b((1[0-2]|0?[1-9]):([0-5][0-9]) ([AaPp][Mm]))"
df %>%
mutate(date = substr(game_info, 1,5),
time = str_extract(game_info, my_pattern),
helper = str_remove(game_info, my_pattern), .keep="unused") %>%
mutate(helper = str_squish(str_remove(helper, substr(helper, 1,5)))) %>%
separate(helper, c("away_team_id", "away_team_name"), sep = '\\s', remove = FALSE) %>%
mutate(home_team_id = str_extract_all(helper, '(\\d )(?!.*\\d)'),
home_team_name = sub(".*\\s", "", helper), .keep="unused")
date time away_team_id away_team_name home_team_id home_team_name
1 12/16 7:00 PM 751 Appalachian 752 Duke
2 12/16 7:00 PM 753 Chicago 754 Indiana-Purdue
3 12/16 8:00 PM 755 Texas-Arlington 756 Roberts
4 12/16 10:00 PM 757 Dartmouth 758 Stanford
uj5u.com熱心網友回復:
您可以試試這個只需要簡單模式匹配的解決方案[:digit:]。一個額外的要求就是在開頭有日期和時間,在數字 ID 之間有角色團隊資訊。
此外,您可以使用trimws拆分串列dspl來洗掉不需要的TAB或類似的。
資料
dat <- structure(list(game_info = c("12/16 7:00 PM 751 Appalachian State 752 Duke",
"12/16 7:00 PM 753 Chicago State 754 Indiana-Purdue", "12/16 8:00 PM 755 Texas-Arlington 756 Oral Roberts",
"12/16 10:00 PM 757 Dartmouth 758 Stanford")), class = "data.frame", row.names = c(NA,
-4L))
dspl <- strsplit( dat$game_info, " " )
dat_tmp <- cbind( date=as.vector(sapply( dspl, function(x) x[1] )),
time=unlist( lapply( dspl, function(x) paste( x[2:3], collapse=" " ) ) ),
away_team_id=as.vector( sapply( dspl, function(x) x[4] ) ) )
data.frame( dat_tmp,
away_team_name=sapply( dspl, function(x)
paste(x[ tail( head( grep( "[[:digit:]]", x )[3]:grep( "[[:digit:]]", x )[4], -1 ), -1 ) ], collapse=" ") ),
home_team_id=sapply( dspl, function(x)
x[ max( grep( "[[:digit:]]", x ) )] ),
home_team_name=sapply( dspl, function(x)
paste( tail( x[ max( grep( "[[:digit:]]", x ) ):length(x)], -1), collapse=" " ) ) )
date time away_team_id away_team_name home_team_id home_team_name
1 12/16 7:00 PM 751 Appalachian State 752 Duke
2 12/16 7:00 PM 753 Chicago State 754 Indiana-Purdue
3 12/16 8:00 PM 755 Texas-Arlington 756 Oral Roberts
4 12/16 10:00 PM 757 Dartmouth 758 Stanford
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383116.html
下一篇:用多列中的字串替換數字,R
