strpslit一个字符数组并同时转换为dataframe

时间:2017-02-25 01:02:55

标签: r data-manipulation

我感觉像是一个困难的数据操作问题,我希望得到一些指导。这是我当前数组的测试版本,以及我希望获得的数据帧:

dput(test)
c("<play quarter=\"1\" oncourt-id=\"\" time-minutes=\"12\" time-seconds=\"0\" id=\"1\"/>", "<play quarter=\"2\" oncourt-id=\"\" time-minutes=\"10\" id=\"1\"/>")

test 
[1] "<play quarter=\"1\" oncourt-id=\"\" time-minutes=\"12\" time-seconds=\"0\" id=\"1\"/>"
[2] "<play quarter=\"2\" oncourt-id=\"\" time-minutes=\"10\" id=\"1\"/>" 

desired_df
  quarter    oncourt-id    time-minutes    time-seconds    id
1       1            NA              12               0     1
2       3            NA              10              NA     1

我正在处理一些问题:

  1. 字符数组“test”有反斜杠,应该没有任何内容,但我在使用格式gsub(“\”,“”,test)时使用gsub有困难。
  2. 并非测试中的每个元素都具有相同数量的条目,请注意示例中第二个元素没有时间秒,因此对于数据帧我更希望它返回NA。
  3. 我已经尝试过使用strsplit(test,“”)来首先拆分空格,这些空格只存在于不同的列之间,但后来又返回了一个难以处理的列表列表。

1 个答案:

答案 0 :(得分:4)

你有xml。您可以解析它,然后对结果运行rbindlist。这可能比尝试将名称 - 值对分割为字符串要轻松得多。

dflist <- lapply(test, function(x) {
    df <- as.data.frame.list(XML::xmlToList(x))
    is.na(df) <- df == ""
    df
})

data.table::rbindlist(dflist, fill = TRUE)
#    quarter oncourt.id time.minutes time.seconds id
# 1:       1         NA           12            0  1
# 2:       2         NA           10           NA  1

注意:此解决方案需要 XML data.table 包。