簡體   English   中英

如何使用R data.table / data.frame將長字符串拆分/解析為表格數據?

[英]How to split/parse long strings into tabular data with R data.table/data.frame?

我有一個R data.table帶有一列我需要解析的奇怪格式的數據。 對於每一行,都有一個列identity ,其格式如下:

identity
cat:211:93|dog:616:58|bird:1270:46|fish:2068:31|horse:614:1|cow:3719:1012

它的格式name:total_number:count_number ,以|分隔

data.table的示例如下:

library(data.table)

foo = data.table(name = c('Luna', 'Bob', 'Melissa'), 
    number = c(23, 37, 33), 
    identity = c('cat:311:93|dog:516:58|bird:2270:46|fish:1268:31|horse:514:1|cow:319:12', 'bird:1270:35|fish:2068:11|horse:614:44|cow:319:21', 'fish:72:41'))

print(foo)
name        number    identity
'Luna'      23        cat:311:93|dog:516:58|bird:2270:46|fish:1268:31|horse:514:1|cow:319:12
'Bob'       37        bird:1270:35|fish:2068:11|horse:614:44|cow:319:21
'Melissa'   33        fish:72:41

我的問題是如何解析這些行,使每個name成為一個新列,並將數字計算為分數, count_number/total_number

格式正確如下:

name        number    cat        dog         bird        fish        horse       cow
'Luna'      23        0.2990354  0.1124031   0.02026432  0.02444795  0.001945525 0.03761755
'Bob'       37        NA         NA          0.02755906   0.005319149    0.001628664     0.03761755
'Melissa'   33        NA         NA          NA          0.5694444   NA       NA

鑒於我事先知道了列的“名稱”,我怎么能解析這些行呢?

我認為應該有一些方法來使用data.table::tstrsplit() ,例如

tstrsplit(foo$identity, "|", fixed=TRUE)

(我也很高興使用data.frame或dplyr。)

在計算比率和重新整形為所需格式之前,您可以將|拆分|,熔化,然后再拆分:。

library(data.table)
#step 4: reshape into desired wide format
dcast(
    #step 1: split by | and get the elements into a column
    foo[, melt(tstrsplit(identity, "\\|")), by=.(name, number)][,
        #step 2: split by : to get count_number and total_number
        tstrsplit(value, ":"), by=.(name, number)][,
            #step 3: calculate ratio
            ratio := as.numeric(V3) / as.numeric(V2)],
    name + number ~ V1, value.var="ratio")

輸出:

      name number       bird       cat        cow       dog        fish       horse
1:     Bob     37 0.02755906        NA 0.06583072        NA 0.005319149 0.071661238
2:    Luna     23 0.02026432 0.2990354 0.03761755 0.1124031 0.024447950 0.001945525
3: Melissa     33         NA        NA         NA        NA 0.569444444          NA

以更一般的方式解決OP的評論:您必須在編碼之前首先設計問題的解決方案。 想一想您在解決方案的每個步驟中期望的輸出類型。 然后讓控制台成為您的TA,文檔將成為您的講師。

例如,在解決方案的第一步中,您將拆分為| ,所以你在控制台中運行以下

foo[, tstrsplit(identity, "|", fixed=TRUE)]

你有什么期待? 你看到了什么? 缺少namenumber 將它們添加到by=

foo[, tstrsplit(identity, "|", fixed=TRUE), by=.(name, number)]

然后,你得到了什么? 錯誤? 你能修好它嗎? 也許再讀一遍文檔? 如果仍然無法解決,也許可以在線搜索? 記住您要通過此步驟實現的目標:如何將其放入單個列中? 也許你找到類似下面的東西:

foo[, unlist(tstrsplit(identity, "|", fixed=TRUE)), by=.(name, number)]

然后,繼續下一步。

暫無
暫無

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

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