web-dev-qa-db-ja.com

1つの列の複数の値を複数の行に分割するR

私は、ほとんどの場合、行ごとに1つの観測であるデータフレームを持っています。ただし、一部の行には複数の値があります。

# A tibble: 3 x 2
          `number`   abilities
             <dbl>       <chr>
1               51       b1261
2               57        d710
3               57 b1301; d550

structure(list(`number` = c(51, 57, 57), abilities = c("b1261", 
"d710", "b1301; d550")), .Names = c("number", "abilities"
), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"
))

以下を入手したいのですが。

# A tibble: 3 x 2
          `number`   abilities
             <dbl>       <chr>
1               51       b1261
2               57        d710
3               57        d550
4               57       b1301

で分割するのに十分簡単です。しかし、特に能力に2つ以上の値が含まれている可能性があるため、新しい行を簡単に追加する方法がわかりません。

これは次のように非常に似ています: 列を行に区切るRセミコロン ですが、重複を削除する必要はありません

17
pluke

関数がありますseparate_rows in tidyrそれを行うには:

library(tidyr)
## The ";\\s+" means that the separator is a ";" followed by one or more spaces
separate_rows(df,abilities,sep=";\\s+")
  number abilities
   <dbl>     <chr>
1     51     b1261
2     57      d710
3     57     b1301
4     57      d550
24
Lamia

dplyrにはunnestがあるため、これに適しています。

library(tidyverse)
library(stringr)
df %>%
    mutate(unpacked = str_split(abilities, ";")) %>%
    unnest %>%
    mutate(abilities = str_trim(unpacked))
5
Marius

別のオプションはcSplitです

 library(splitstackshape)
 cSplit(df1, 'abilities', '; ', 'long')
 #   number abilities
 #1:     51     b1261
 #2:     57      d710
 #3:     57     b1301
 #4:     57      d550
1
akrun