[英]'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.