Разделите строку на столбец символами и числами в R - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть этот список, который содержит разные строки:

портфолио:

[[1]]
[1] "BANK       Percentage"

[[2]]
[1] "JP MORGAN     16.93%"

[[3]]
[1] "BNP PARIBAS      14.29%"

[[4]]
[1] "JAPAN POST BANK    13.96%"

[[5]]
[1] "Sumitomo Mitsui Banking   9.80%"

[[6]]
[1] "Banco Santander  8.67%"

[[7]]
[1] "Deutsche Bank  6.26%"

[[8]]
[1] "CITIBANK  6.23%"

[[9]]
[1] "Barclays Bank  4.84%"

[[10]]
[1] "Royal Bank of Canada 4.38%"

[[11]]
[1] "Postal Savings Bank of China Co Ltd 4.22%"

Я разбил эти строки на две колонки с этим кодом:

portfolio <- lapply(portfolio, str_split, pattern = "  ", n = 2, simplify = T)
portfolio <- do.call(rbind, portfolio)

Как вы можете видеть, я разбил на два пробела как образец, а затем я получил матрицу с двумя столбцами, но последние два объекта исчезли, потому что они имеют только один пробел между символами и числами, так что это не работает.

Ребята, помогите мне, пожалуйста.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2020

Мы можем использовать функцию data.table::tstrsplit и регулярное выражение взглянуть на аромат Perl. Используя объект portfolio, определенный @ r2evans, вы можете попробовать:

require(data.table)
setNames(data.frame(
           tstrsplit(unlist(portfolio)[-1],"\\s+(?=[0-9])",perl=TRUE)
                   ),
           strsplit(portfolio[[1]],"\\s+")[[1]])
2 голосов
/ 13 апреля 2020

Попробуйте это:

portfolio <- list(
"BANK       Percentage",
"JP MORGAN     16.93%",
"BNP PARIBAS      14.29%",
"JAPAN POST BANK    13.96%",
"Sumitomo Mitsui Banking   9.80%",
"Banco Santander  8.67%",
"Deutsche Bank  6.26%",
"CITIBANK  6.23%",
"Barclays Bank  4.84%",
"Royal Bank of Canada 4.38%",
"Postal Savings Bank of China Co Ltd 4.22%")
gre <- gregexpr("[.0-9%]+", portfolio[-1])
pct <- regmatches(portfolio[-1], gre)
pct <- unlist(replace(pct, sapply(pct, is.null), NA))
nm <- trimws(sapply(regmatches(portfolio[-1], gre, invert = TRUE), `[[`, 1))

data.frame(BANK = nm, Percentage = pct, stringsAsFactors = FALSE)
#                                   BANK Percentage
# 1                            JP MORGAN     16.93%
# 2                          BNP PARIBAS     14.29%
# 3                      JAPAN POST BANK     13.96%
# 4              Sumitomo Mitsui Banking      9.80%
# 5                      Banco Santander      8.67%
# 6                        Deutsche Bank      6.26%
# 7                             CITIBANK      6.23%
# 8                        Barclays Bank      4.84%
# 9                 Royal Bank of Canada      4.38%
# 10 Postal Savings Bank of China Co Ltd      4.22%
0 голосов
/ 13 апреля 2020

Код ниже должен работать для вас. Он использует более сложный шаблон разбиения с использованием регулярных выражений. (\\s{2,}|\\s(?=[0-9])), так что он разделяет любые символы, если имеется более двух пробелов (\\s{2,}) или (|), один пробел, если за ним следует число (\\s(?=[0-9])). Это может все еще быть обманутым, если имя банка содержит номер (например, «Банк 3 5.67%»), что приведет к его отказу.

library(stringr)

dat <- 
  list(c("BANK       Percentage"),
       c("JP MORGAN     16.93%"),
       c("BNP PARIBAS      14.29%"),
       c("JAPAN POST BANK    13.96%"),
       c("Sumitomo Mitsui Banking   9.80%"),
       c("Banco Santander  8.67%"),
       c("Deutsche Bank  6.26%"),
       c("CITIBANK  6.23%"),
       c("Barclays Bank  4.84%"),
       c("Royal Bank of Canada 4.38%"),
       c("Postal Savings Bank of China Co Ltd 4.22%"))

portfolio <- 
  lapply(dat, str_split, "(\\s{2,}|\\s(?=[0-9]))", n = 2, simplify = TRUE)

portfolio <- do.call(rbind, portfolio)

portfolio
#>       [,1]                                  [,2]        
#>  [1,] "BANK"                                "Percentage"
#>  [2,] "JP MORGAN"                           "16.93%"    
#>  [3,] "BNP PARIBAS"                         "14.29%"    
#>  [4,] "JAPAN POST BANK"                     "13.96%"    
#>  [5,] "Sumitomo Mitsui Banking"             "9.80%"     
#>  [6,] "Banco Santander"                     "8.67%"     
#>  [7,] "Deutsche Bank"                       "6.26%"     
#>  [8,] "CITIBANK"                            "6.23%"     
#>  [9,] "Barclays Bank"                       "4.84%"     
#> [10,] "Royal Bank of Canada"                "4.38%"     
#> [11,] "Postal Savings Bank of China Co Ltd" "4.22%"

Создано в 2020-04-13 Представить пакет (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...