【问题标题】:R: parsing data with a one-to-many relationshipR:解析具有一对多关系的数据
【发布时间】:2015-04-02 09:55:27
【问题描述】:

我正在尝试将具有这种格式数据的文件解析为 R:

Author:              Books:
Jane Austen          Sense and Sensibility 
Justin Bieber        NA
Shakespeare          The Taming of the Shrew | Much Ado About Nothing

它具有一对多的结构。我想要的是一个长格式的数据框,如下所示:

Author:         Books:
Jane Austen     Sense and Sensibility
Shakespeare     The Taming of the Shrew
Shakespeare     Much Ado About Nothing

如果您想获取一位作者的所有书籍,或者查找特定书籍的作者,这会更方便。

更一般地说,您如何将(字符串,值列表)格式的数据框转换为(字符串1,值1); (字符串 1,值 2); (string2, value3) 格式?我知道如何使用 strsplit,但我对这里的数据框操作不太确定。

奖励积分:我想要快速运行的东西(我在现实生活中有一个大型数据集)。

我正在考虑构建一个大小合适的空数据框(由 sum(sapply(df$colWithListOfStrings,length))) 给出,并使用 for 循环进行迭代以填充它。

PS:我们在这里假设一本书只有一个作者。

【问题讨论】:

    标签: r database dataframe


    【解决方案1】:

    您可以使用来自splitstackshape 包的cSplit(来自Ananda Mahto 的非常好的工具)

    library(splitstackshape)
    cSplit(data, splitCols=2, sep = "|", direction = "long")[!is.na(Books)]
    #                   Author                   Books
    #1:            Jane Austen   Sense and Sensibility
    #2:            Shakespeare The Taming of the Shrew
    #3:            Shakespeare  Much Ado About Nothing
    

    输入(数据)

    structure(list(Author = c("Jane Austen", "           Justin Bieber", 
                                  "           Shakespeare"), Books = c("          Sense and Sensibility ", 
                                                                       "        NA", "          The Taming of the Shrew | Much Ado About Nothing"
                                  )), .Names = c("Author", "Books"), class = "data.frame", row.names = c(NA, 
                                                                                                         -3L))
    

    【讨论】:

    • 这是一个很好的解决方案!能够使用table(dataLong, useNA = "ifany") 轻松地以列联表的形式显示每个一对多的观察结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    相关资源
    最近更新 更多