簡體   English   中英

將xml格式轉換為r中的數據幀

[英]Convert xml format to data frame in r

我有一個水族館監控系統,它以 XML 格式記錄數據,我在本地檢索這些數據。 這是結構的示例;

<datalog>
    <record>
        <date>20210301 00:00</date>
        <probe>
            <name>Tank1Temp</name>
            <type>Temperature</type>
            <value>10.4</value>
        </probe>
        <probe>
            <name>Tank1Sal</name>
            <type>Salinity</type>
            <value>28.0</value>
        </probe>
        <probe>
            <name>Tank1pH</name>
            <type>pH</type>
            <value>8.0</value>
        </probe>
    </record>
    <record>
        <date>20210301 00:01</date>
        <probe>
            <name>Tank1Temp</name>
            <type>Temperature</type>
            <value>10.5</value>
        </probe>
        <probe>
            <name>Tank1Sal</name>
            <type>Salinity</type>
            <value>28.1</value>
        </probe>
        <probe>
            <name>Tank1pH</name>
            <type>pH</type>
            <value>8.0</value>
        </probe>
    </record>
</datalog>

這是一個非常簡化的示例,記錄每分鍾記錄 24 小時,因此該塊每天重復 1440 次。 與上面的三個示例相比,記錄的每條記錄的探測次數也多得多。

我想把它變成一個包含“日期”、“名稱”、“類型”、“值”列的數據框。 我在 web 上遇到了類似的問題,但沒有一個解決方案適合我。 我認為這是因為探針都嵌套在日期中,並且示例更“簡單”,並且沒有解釋如何處理嵌套結構。

到目前為止,我可以讓 R 從系統中讀取數據(它連接到只能在本地訪問的路由器)但是一旦在 R 中我迷路了。 我嘗試使用以下代碼;

dataframe <- xmlToDataFrame(getNodeSet(data.20210225, c("//record/date", "//record/probe")))

這會產生一個看起來像的數據框;

文本 姓名 類型 價值
20210301 00:00 不適用 不適用 不適用
不適用 Tank1Temp 溫度 10.4
不適用 Tank1Sal 鹽度 28.0
不適用 Tank1pH 酸鹼度 8.0
20210301 00:01 不適用 不適用 不適用
不適用 Tank1Temp 溫度 10.5
不適用 Tank1Sal 鹽度 28.1
不適用 Tank1pH 酸鹼度 8.0

這在保存數據方面是有效的,但由於所有的 NA,它對於分析不是很有用。

任何幫助是極大的贊賞。

如何將此 XML 變成數據框? 還是讓數據框對我的分析更友好?

考慮通過使用xpathApply構建單個<record>級別數據幀的列表來擴展您的數據幀處理,以便在最后進行最終的rbind編譯:

recds <- xpathApply(data.20210225, "//record", function(x) {
             # ADD CLEANED NEW date COLUMN  
             df <- within(xmlToDataFrame(x), { date <- text[1] })

             # RE-ORDER/SUBSET COLS, DROP FIRST ROW, RESET ROWNAMES
             data.frame(df[-1, c("date", "name", "type", "value")], row.names=NULL)
         })

final_df <- do.call(rbind, recds)
final_df
#             date      name        type value
# 1 20210301 00:00 Tank1Temp Temperature  10.4
# 2 20210301 00:00  Tank1Sal    Salinity  28.0
# 3 20210301 00:00   Tank1pH          pH   8.0
# 4 20210301 00:01 Tank1Temp Temperature  10.5
# 5 20210301 00:01  Tank1Sal    Salinity  28.1
# 6 20210301 00:01   Tank1pH          pH   8.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM