0

我有一个来自体育博彩网站的文本文件,并且想将这些行转换为数据框。

文本文件如下所示:

18 May 2013 1   X   2   B's
15:30   Augsburg - Greuther 3:1 
1.43
4.55
7.27
16
18:30   Dortmund - Hoffenheim   1:2 
1.39
5.23
6.79
16
11 May 2013 1   X   2   B's
15:30   Bayer - Hannover    3:1 
1.29
5.77
9.46
16

之后的数据框应如下所示:

Date        Time    Team1       Team2       G1  G2  1   0   2
18 May 2013 15:30   Augsburg    Greuther    3   1   1.43    4.55    7.27
18 May 2013 18:30   Dortmund    Hoffenheim  1   2   1.39    5.23    6.79
11 May 2013 15:30   Bayer       Hannover    3   1   1.29    5.77    9.46

我正在考虑一些 for 循环,在其中检查我所在的行是否包含日期。我会将变量设置为 current_date,如果没有新日期,它将不会更新为新日期。例如,第一个匹配都在同一天,因此日期变量将保留 May18 用于第二行。

我想生成包含当前日期、时间、团队1、团队2、结果(目标1,目标2)的向量,然后是获胜、平局、失败的几率。

然后将它们彼此绑定。

我认为我在逐行读取数据文件并检查类型时遇到的最多问题。可以指定时间之后下一个字符是team1,“-”之后是team2,“:”之前和之后是G1和G2,并且接下来的三行将直接包含在该向量中吗?

如果 txt 文件大约有 20,000 行,我也不确定 for 循环是否是最聪明的主意。也应该排除时间之后的第 4 行。

如果我问这样的问题,我很抱歉,我知道我可以多尝试几个小时,然后在这里发布我的代码,但我最终可能会得到不足的半生不熟的代码:/

4

2 回答 2

1

这是一个尝试

lines <- readLines("clipboard") # copy the sample text file to clipboard first
lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
idx_dates <- strptime(lines, "%d %B %Y")
idx_dates <- which(!is.na(idx_dates))
idx_times <- grep("[0-9]+:[0-9]+", lines)

parse_item <- function(i) {
    date <- lines[[max(idx_dates[idx_dates < i])]]
    date <- substr(date, 1, nchar(date)-16)    
    date <- paste(date, substr(lines[[i]], 1, 5))
    date <- strptime(date, "%d %B %Y %H:%M")
    teamsgoals <- substring(lines[[i]], 9)
    teamsgoals <- gsub(" +", " ", teamsgoals)
    teamsgoals <- strsplit(teamsgoals, " ")[[1]]
    team1 <- teamsgoals[1]
    team2 <- teamsgoals[3]
    goals <- strsplit(teamsgoals[4], ":")[[1]]
    g1 <- as.numeric(goals[1])
    g2 <- as.numeric(goals[2])
    q1 <- as.numeric(lines[[i+1]])
    q0 <- as.numeric(lines[[i+2]])
    q2 <- as.numeric(lines[[i+3]])
    data.frame(date=date, team1=team1, team2=team2, g1=g1, g2=g2, q1=q1, q0=q0, q2=q2, stringsAsFactors=FALSE)
}

parsed <- lapply(idx_times, FUN=parse_item)
Reduce(rbind, parsed)
Sys.setlocale("LC_TIME", lct)

返回

                 date    team1      team2 g1 g2   q1   q0   q2
1 2013-05-18 15:30:00 Augsburg   Greuther  3  1 1.43 4.55 7.27
2 2013-05-18 18:30:00 Dortmund Hoffenheim  1  2 1.39 5.23 6.79
3 2013-05-11 15:30:00    Bayer   Hannover  3  1 1.29 5.77 9.46
于 2013-06-25T19:27:03.613 回答
0

此示例提供有关如何使用 Web 数据创建数据框的提示。

http://giventhedata.blogspot.com/2012/08/r-and-web-for-beginners-part-iii.html

于 2013-06-25T17:14:43.877 回答