2017-06-06 197 views
4

我有一個數據框,其大部分是每行一個觀察值。然而,某些行有多個值:將一個列中的多個值拆分爲多個行R

# 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 semicolon delimited a column into rows,但並不需要刪除重複

回答

5

有一個功能separate_rowstidyr來做到這一點:

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 
+1

我認爲你也需要修剪空白,或者使用'sep =「; \\ s +」',否則最後一個條目在開始時會有空格。 – Marius

+0

@Marius你是對的,我沒有發現它。謝謝! – Lamia

+0

謝謝你,我不知道tidyr中的那個特性。我將空格匹配調整爲:「; \\ s *」以允許零個或多個空格 – pluke

2

dplyr好這個,因爲它有unnest

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

另一種選擇是cSplit

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