R 字符串从数字中分割单词并保持固定的子字符串计数

R 字符串从数字中分割单词并保持固定的子字符串计数,r,string,pdf,R,String,Pdf,我有一份pdf格式的资产负债表。它有4列;变量名称、本年的值、上一年的值以及本年和上一年之间的差异。我没有共享pdf的权限,但这是一个示例 这是我尝试使用的代码: Assets <- BS[4:40] %>% trimws("l") %>% strsplit(split = "\\s{2,}"); Assets 我希望最终得到一个包含4列的数据框;行项目、当前年度、上一年度、变更 我想将[2:5]中的每个字符串拆分为4个子字符串

我有一份pdf格式的资产负债表。它有4列;变量名称、本年的值、上一年的值以及本年和上一年之间的差异。我没有共享pdf的权限,但这是一个示例

这是我尝试使用的代码:

Assets <- BS[4:40] %>%
  trimws("l") %>%
  strsplit(split = "\\s{2,}"); Assets
  • 我希望最终得到一个包含4列的数据框;行项目、当前年度、上一年度、变更
  • 我想将[2:5]中的每个字符串拆分为4个子字符串。行项目的名称和3个数值。第2行有一个美元符号,所以我需要删除它。第4行没有当前值,因此我需要在其位置自动包含一个零
  • 所需的数据帧输出:

         Line_Item                                         Current_Year                     Prior_Year             Change
         CASH                                             99,999,999.00                  99,999,999.00               0.00  
         CASH SLIPS                                        1,000,000.00                   1,000,000.00               0.00   
         BONDS                                                     0.00                     500,000.00       (500,000.00) 
         ACCOUNTS RECEIVABLE                               1,000,000.00                   2,000,000.00     (1,000,000.00) 
    
    dput:

    list(c("CASH", "$99,999,999.00", "$99,999,999.00", "0.00"), 
        c("CASH SLIPS", "1,000,000.00", "1,000,000.00", "0.00"
        ), c("BONDS", "500,000.00", "(500,000.00)"
        ), c("ACCOUNTS RECEIVABLE", "1,000,000.00", "2,000,000.00", 
        "(1,000,000.00)"))
    

    您可以创建一个函数来确定是否缺少第三个值:

    m <- function(x){
      if(length(x)==4) return(x)
      if(grepl("\\)", x[3]))  c(x[1],0,x[-1])
      else c(x[1:2],0, x[3])
    }
             
    data.frame(t(sub("\\$","",sapply(mystring, m))))
                       X1            X2            X3             X4
    1                CASH 99,999,999.00 99,999,999.00           0.00
    2          CASH SLIPS  1,000,000.00  1,000,000.00           0.00
    3               BONDS             0    500,000.00   (500,000.00)
    4 ACCOUNTS RECEIVABLE  1,000,000.00  2,000,000.00 (1,000,000.00)
    

    m这是一个字符列表。在第4个元素中,本年度没有0。你是怎么决定Blanker的位置的?我被困在这个问题上了。我希望能够直观地做到这一点。问题是,除非有一些规则允许您在问题中包含
    dput(资产)
    的结果,否则无法确定本年或上一年的空白
    m <- function(x){
      if(length(x)==4) return(x)
      if(grepl("\\)", x[3]))  c(x[1],0,x[-1])
      else c(x[1:2],0, x[3])
    }
             
    data.frame(t(sub("\\$","",sapply(mystring, m))))
                       X1            X2            X3             X4
    1                CASH 99,999,999.00 99,999,999.00           0.00
    2          CASH SLIPS  1,000,000.00  1,000,000.00           0.00
    3               BONDS             0    500,000.00   (500,000.00)
    4 ACCOUNTS RECEIVABLE  1,000,000.00  2,000,000.00 (1,000,000.00)