トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン 印刷

リスト型のテキストを文字列に変換する

auditR

有報分析で苦労した話

単純に注記の文章などを分析すると、EDINETコードの他に注記のフィールドがデータ化され、その中には文字列と表や図が入ってくるので、データをリスト形式にしたほうが「一括」して扱いやすいというメリットがある。

しかし、これを分析しようとすると、テキスト部分と表の部分と図の部分とに「分割」したほうが扱いやすい。

表は<table>図は<img>で何とか拾うことが出来るので、そこを他のダミー文字列に置き換えた残りが、テキスト部分。

しかしこのテキストはリスト形式のままなので、文字列に変換しないと、あとあと扱いにくい。

とても苦労したので、それを残しておく。

実験

 テストデータ

> Id = c('A001', "B002", "C003")
> Txt = list(list("sing your way home", "at the close of the day"),   
           list("Oh, say, can you see", "by the dawns early light"),  
            list("ABCDEFG", "HIJKLMN", "OPQRSTU"))  
> (df = tibble(Id, Txt))
# A tibble: 3 x 2
 Id    Txt       
 <chr> <list>    
1 A001  <list [2]>
2 B002  <list [2]>
3 C003  <list [3]>

 変換の方法

文単位のベクトルに変換

> sapply(df$Txt, toString)
[1] "sing your way home, at the close of the day"    "Oh, say, can you see, by the dawns early light"
[3] "ABCDEFG, HIJKLMN, OPQRSTU"                     

文単位のリストに変換

> sapply(df$Txt, unlist)
[[1]]
[1] "sing your way home"      "at the close of the day"

[[2]]
[1] "Oh, say, can you see"     "by the dawns early light"

[[3]]
[1] "ABCDEFG" "HIJKLMN" "OPQRSTU"

 列を変換する

文章単位で変換

> df %>% mutate(Txt = sapply(Txt, toString))
> df %>% mutate(Txt = sapply(Txt, toString))
# A tibble: 3 x 2
  Id    Txt                                           
  <chr> <chr>                                         
1 A001  sing your way home, at the close of the day   
2 B002  Oh, say, can you see, by the dawns early light
3 C003  ABCDEFG, HIJKLMN, OPQRSTU                     

分単位でリストに変換

> df %>% mutate(Txt = sapply(Txt, unlist)) #str_cと同じ結果
# A tibble: 3 x 2
  Id    Txt      
  <chr> <list>   
1 A001  <chr [2]>
2 B002  <chr [2]>
3 C003  <chr [3]>

 旨く行かない方法

理由がわからない

> df %>% sapply(Txt, toString)
get(as.character(FUN), mode = "function", envir = envir) でエラー: 
  変数 'Txt' (モード 'function')は見つかりません 
> df %>% sapply(Txt, unlist)
get(as.character(FUN), mode = "function", envir = envir) でエラー: 
  変数 'Txt' (モード 'function')は見つかりません 

おそらくTxt列の下部にあるlistが無名だから(その無名のリストにあるはずの名前を使って処理すべき)

> df %>% map("Txt", toString)
$Id
NULL

$Txt
NULL
> df %>% map("Txt", unlist)
$Id
NULL

$Txt
NULL
> df %>% map("Txt", toString)
$Id
NULL

$Txt
NULL

Last updated 2019-09-16 | auditR (c) N.Nawata