簡體   English   中英

“字典”列表到data.table列

[英]'dictionary' list to data.table columns

我正在將輸出從API調用轉換為書目數據庫,該數據庫以RIS形式返回內容。 然后,我想獲得一個data.table對象,其中每個數據庫項都有一行,而RIS輸出的每個字段都有一列。

稍后,我將解釋有關RIS的更多信息,但我會陷入以下困境:

我想使用類似的東西來獲取一個data.table:

PubDB <- as.data.table(list(TY = "txtTY",TI = "txtTI"))

返回:

PubDB

      TY    TI
1: txtTY txtTI

但是,我只有一個字符串(實際上是API調用返回的字符串向量:PubStr是一個元素)

PubStr

## [1] "TY = \"txtTY\",TI = \"txtTI\" "

如何將該字符串轉換為上述as.data.table命令中所需的列表?

更具體地說,按照我的代碼的第一步,經過一些字符串操作后, resp<-GET(url)resp<-GET(url) rawToChar(resp$content) resp<-GET(url)rawToChar(resp$content)as.data.table()之后,我有一個數據表,其中每個發布都有行,一列名為PubStr列具有上述字符串。 對於data.table的每一行,如何將此字符串轉換為許多列。 注意:某些行具有更多或更少的字段。

我不確定RIS格式,但是如果這些字符串的每個元素都用逗號分隔,然后在每個逗號內,標題列名稱都用等號分隔,那么這是一個使用基數R和data.table的快速而骯臟的函數:

RIS_parser_fn<-function(x){

string_parse_list<-lapply(lapply(x,
                                 function(i) tstrsplit(i,",")),
                          function(j) lapply(tstrsplit(j,"="),
                                            function(k) t(gsub("\\W","",k))))

datatable_format<-rbindlist(lapply(lapply(string_parse_list,
                                          function(i) data.table(Reduce("rbind",i))),
                                   function(j) setnames(j,unlist(j[1,]))[-1]),fill = T)

return(datatable_format)
}

代碼的第一行只是創建一個包含2個矩陣列表的列表列表。 外部列表的元素數量等於字符串的初始向量的大小。 內部列表恰好具有兩個矩陣元素,其列數等於每個字符串元素中由','符號確定的字段數。 每個列表列表中的第一個矩陣由列標題(由“ =”符號確定)組成,第二個矩陣包含它們等於的值。 最后一個gsub只是刪除矩陣中剩余的任何特殊字符。 如果您希望值中包含非字母數字字符,則可能需要修改此設置。 您的示例中沒有任何內容。

第二行代碼將這些列表轉換為一個data.table對象。 Reduce函數簡單地rbind 2個元素列表,然后將它們轉換為data.tables。 因此,對於每個初始字符串元素,現在只有一個由data.tables組成的列表。 “ j” lapply函數將列名設置為矩陣的第一行,然后從data.table中刪除該行。 最后的rbindlist調用將合並data.tables的列表,這些列表具有不同的列數。 設置fill = T以允許將它們組合,並且將NA分配給不具有該特定字段的像元。

我添加了第二個字符串元素和一個字段來測試代碼:

 PubStr<-c("TY = \"txtTY1\",TI = \"txtTI1\"","TY = \"txtTY2\",TI = \"txtTI2\" ,TF = \"txtTF2\"")

 RIS_parser_fn(PubStr)

返回此:

   TY     TI     TF
1: txtTY1 txtTI1   <NA>
2: txtTY2 txtTI2 txtTF2

希望這會幫助您解決和/或激發一些想法,以獲得更有效的代碼。 祝你好運!

暫無
暫無

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

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