【问题标题】:Converting (web site) text file into data frame in R将(网站)文本文件转换为R中的数据框
【发布时间】:2013-06-25 16:44:35
【问题描述】:

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

文本文件如下所示:

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 行。

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

【问题讨论】:

    标签: r text dataframe


    【解决方案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
    

    【讨论】:

    • 嗨 Karsten,结果看起来与我希望得到的完全一样。现在我试着更彻底地理解你写的函数。我以前从未见过的 sys.set/getlocal(但这些都是自我解释的)。我必须检查 reduce() 以及 idx_times 如何与 grep() 命令完全配合。由于进入 lapply() 函数,我应该确定它们是如何工作的。 Vielen Dank auf jeden Fall für deine Mühe.
    • 只需将文件名传递给readLines 而不是“剪贴板”。 idx_times &lt;- grep(...) 命令使用正则表达式来识别匹配一位或多位数字 [0-9]+、后跟冒号、后跟一位或多位数字的行。顺便说一句,您在哪个网站上抓取了报价?
    • strptime() 对于获取包含日期信息的行非常有用。但是 grep() 命令对我来说仍然是一个完整的谜团,结果只给了我:integer(0)。也许我首先需要另一个包。从技术上讲,我并没有从网络上正确地“抓取”数据,而是复制粘贴了它。我想我必须手工完成每一个 Spieltag(因为我不知道如何浏览网站并提取 html 代码)这不是很多工作。我必须检查有报价的网站(甚至是去年的)。
    • 我向您发送一封包含报价链接的电子邮件
    • 仍在为 grep() 苦苦挣扎。所以我认为问号应该是代码中的加号,对吧? “[0-9]+”等不是“[0-9]?”。如果我改变它,我会得到包含这些组合的“线条”。但是 ] .*" 到底是什么意思呢?
    【解决方案2】:

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

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

    【讨论】:

    • 抱歉,这些教程可能还不错,但对我的问题并没有特别的帮助。但是感谢您的尝试。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多