【问题标题】:Split a String in R, using specifc criteria [closed]使用特定标准在 R 中拆分字符串 [关闭]
【发布时间】:2019-10-09 17:07:30
【问题描述】:

我有这个字符向量,我需要拆分每一行中的元素。

这是数据集的图片和代码:

Y = c("Voci dell’attivo 31-dic-2018 31-dic-2017", "10. Cassa e disponibilità liquide 113.154.047 105.800.459", 
"20. Attività finanziarie valutate al fair value con impatto a conto economico 18.400.808 16.926.126", 
"a) attività finanziarie detenute per la negoziazione 4.343.408 4.356.151", 
"c) altre attività finanziarie obbligatoriamente valutate al fair value 14.057.400 12.569.975", 
"30. Attività finanziarie valutate al fair value con impatto sulla redditività complessiva 636.155.429 738.384.151", 
"40. Attività finanziarie valutate al costo ammortizzato 11.203.834.137 11.113.118.111", 
"a) crediti verso banche 3.198.599.841 3.375.218.889", "b) crediti verso clientela 8.005.234.296 7.737.899.222", 
"50. Derivati di copertura 516.238 696.134", "70. Partecipazioni 183.546.796 156.038.259", 
"80. Attività materiali 224.588.110 237.315.814", "90. Attività immateriali 1.917.192 2.041.953", 
"di cui:", "- avviamento 1.650.000 1.650.000", "100. Attività fiscali 222.227.750 175.106.461", 
"a) correnti 4.897.477 10.066.708", "b) anticipate 217.330.273 165.039.753", 
"120. Altre attività 82.551.535 110.120.187", "Totale dell'attivo 12.686.892.042 12.655.547.655", 
"(unità di euro)", "Voci del passivo e del patrimonio netto", 
"31-dic-2018 31-dic-2017", "10. Passività finanziarie valutate al costo ammortizzato 11.375.985.022 11.176.338.096", 
"a) debiti verso banche 146.551.210 144.854.107", "b) debiti verso clientela 10.861.850.231 10.251.703.644", 
"c) titoli in circolazione 367.583.581 779.780.345", "20. Passività finanziarie di negoziazione 2.392.620 2.370.319", 
"40. Derivati di copertura 6.189.059 2.971.997", "60. Passività fiscali 4.091.701 3.909.554", 
"a) correnti 752.147 -", "b) differite 3.339.554 3.909.554", 
"80. Altre passività 239.940.794 152.157.192", "90. Trattamento di fine rapporto del personale 54.720.108 56.331.622", 
"100. Fondi per rischi e oneri: 66.580.390 69.699.078", "a) impegni e garanzie rilasciate 12.705.663 9.475.181", 
"c) altri fondi per rischi e oneri 53.874.727 60.223.897", "110. Riserve da valutazione 119.988.702 139.381.644", 
"140. Riserve 460.527.397 761.938.256", "150. Sovrapprezzi di emissione 126.318.353 126.318.353", 
"160. Capitale 155.247.762 155.247.762", "180. Utile (perdita) d’esercizio (+/-) 74.910.134 8.883.782", 
"Totale del passivo e del patrimonio netto 12.686.892.042 12.655.547.655")

基本上我应该做的是:

  • 将第一个数字/括号和所有以下单词放入一列

  • 将第一个数字放在第二列

  • 删除最后一个数字

我不知道如何让 R 识别同一字符串中不同类型的元素。我该怎么做?

【问题讨论】:

  • 不清楚你想要的预期输出,因为有"di cui:""- avviamento 1.650.000 1.650.000""a) correnti 752.147 -"这样的情况
  • 在这种情况下,“di cui”是一个单词,后面没有数字,因此它将占据第一列的第 i 行,但在第 i 行的第二列中没有任何内容,因此它将保留空的。简化:第一个数字左边的所有东西(单词、括号等..)必须在第一列
  • 如果我继续这个,看起来会有很多问题。我出去了
  • 用包unglue你可以做unglue_data(Y,"{text} {number=[0-9.]+} {=.*}"),到text我们提取任何东西,然后数字应该在一个空格后面包含数字或点,然后我们有另一个空格任何我们不想提取的东西。

标签: r regex string stringr


【解决方案1】:

鉴于您的Y,这应该可以实现您想要的,或者非常接近:

library(tidyverse)
tibble(orig = str_remove(string = Y, pattern = " [[:digit:][:punct:]]+$")) %>% 
  transmute(col1 = str_remove(string = orig, pattern = " [[:digit:][:punct:]]+$"), 
            col2 = str_extract(string = orig, pattern = "[[:digit:][:punct:]]+$"))
#> # A tibble: 43 x 2
#>    col1                                                        col2        
#>    <chr>                                                       <chr>       
#>  1 Voci dell’attivo 31-dic-2018 31-dic-2017                    -2017       
#>  2 10. Cassa e disponibilità liquide                           113.154.047 
#>  3 20. Attività finanziarie valutate al fair value con impatt… 18.400.808  
#>  4 a) attività finanziarie detenute per la negoziazione        4.343.408   
#>  5 c) altre attività finanziarie obbligatoriamente valutate a… 14.057.400  
#>  6 30. Attività finanziarie valutate al fair value con impatt… 636.155.429 
#>  7 40. Attività finanziarie valutate al costo ammortizzato     11.203.834.…
#>  8 a) crediti verso banche                                     3.198.599.8…
#>  9 b) crediti verso clientela                                  8.005.234.2…
#> 10 50. Derivati di copertura                                   516.238     
#> # … with 33 more rows

reprex package (v0.3.0) 于 2019 年 10 月 9 日创建

澄清一下:它使用美元符号告诉正则表达式从字符串末尾的匹配项开始查找,因此该代码首先会删除数字和点的最后一个组合,然后从剩余的字符串中删除,它要么保留或删除数字和点以创建两列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2014-10-07
    • 2018-06-09
    • 2012-12-25
    相关资源
    最近更新 更多