私はこのテーブルを持っています:
cca2 ccn3 cca3 borders
AX 248 ALA
AL 8 ALB MNE,GRC,MKD,UNK
AD 20 AND FRA,ESP
AT 40 AUT CZE,DEU,HUN,ITA,LIE,SVK,SVN,CHE
BE 56 BEL FRA,DEU,LUX,NLD
境界線を複数の列に分けたいと考えています。ご覧のとおり、境界線には同じ量のデータがありません。
私は試した:
newCountries <- data.frame(do.call('rbind', strsplit(as.character(countries$borders),',',fixed=TRUE)))
しかし、うまくいきませんでした...どうすればこのplsを解決できますか?
結果は次のようになります。
cca2 ccn3 cca3 b1 b2 b3 b4 b5 b6 b7 b8
AX 248 ALA NA NA NA NA NA NA NA NA
AL 8 ALB MNE GRC MKD UNK NA NA NA NA
AD 20 AND FRA ESP NA NA NA NA NA NA
AT 40 AUT CZE DEU HUN ITA LIE SVK SVN CHE
BE 56 BEL FRA DEU LUX NLD NA NA NA NA
これが2つの方法です。
1つ目は主にベースRですがseparate
、tidyr
(と一緒に出荷tidyverse
)から借用します。このために、私sapply
は文字列をの各値に分割し、borders
それらの最大長を取りました。この場合、それは8つの境界線です。次に、これを使用しての列名を決定しましたseparate
。separate
便利な関数だと思いますが、必要な列数が正確にわからない場合は注意が必要な場合があります。
2番目の方法は、dplyr
ベースです。ここでは、文字列をに分割し、長いデータフレームborders
にunnest
編集し、の値ごとに存在するエントリの数に基づいて列番号を作成し、それをワイドフォーマットに戻すためにcca2
使用spread
しました。
library(tidyverse)
max_borders <- max(sapply(df$borders, function(x) length(strsplit(x, ",")[[1]]), simplify = T))
tidyr::separate(df, borders, into = paste0("b", 1:max_borders), sep = ",")
#> Warning: Expected 8 pieces. Missing pieces filled with `NA` in 3 rows [2,
#> 3, 5].
#> # A tibble: 5 x 11
#> cca2 ccn3 cca3 b1 b2 b3 b4 b5 b6 b7 b8
#> <chr> <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 AX 248 ALA <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 2 AL 8 ALB MNE GRC MKD UNK <NA> <NA> <NA> <NA>
#> 3 AD 20 AND FRA ESP <NA> <NA> <NA> <NA> <NA> <NA>
#> 4 AT 40 AUT CZE DEU HUN ITA LIE SVK SVN CHE
#> 5 BE 56 BEL FRA DEU LUX NLD <NA> <NA> <NA> <NA>
df %>%
mutate(border_list = str_split(borders, ",")) %>%
unnest(border_list) %>%
select(-borders) %>%
group_by(cca2) %>%
mutate(col = paste0("b", row_number())) %>%
spread(key = col, value = border_list)
#> # A tibble: 5 x 11
#> # Groups: cca2 [5]
#> cca2 ccn3 cca3 b1 b2 b3 b4 b5 b6 b7 b8
#> <chr> <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 AD 20 AND FRA ESP <NA> <NA> <NA> <NA> <NA> <NA>
#> 2 AL 8 ALB MNE GRC MKD UNK <NA> <NA> <NA> <NA>
#> 3 AT 40 AUT CZE DEU HUN ITA LIE SVK SVN CHE
#> 4 AX 248 ALA <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 5 BE 56 BEL FRA DEU LUX NLD <NA> <NA> <NA> <NA>
reprexパッケージ(v0.2.0)によって2018-05-08に作成されました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加