2017-12-26 17 views
1

";"で区切られた値を含む1つの列を含むデータフレームからはどうなりますか?セパレータで複数の列に分割します

df <-data.frame(id = c(1,2,3), stock = c("Google;Yahoo","Microsoft;Google","Yahoo")) 

このようなデータフレーム生成:

df <-data.frame(id = c(1,2,3), stock_1 = c("Google","Microsoft","Yahoo"), stock_2 = c("Yahoo","Google","NA")) 
+2

'ライブラリ(splitstackshape); cSplit(df、 "stock"、 ";") '。 – A5C1D2H2I1M1N2O1R2T1

答えて

4

1)は、長い形式に変換し、最終的にカラム名を含むname列を追加し、戻ってそれを変換するspreadを使用する使用separate_rowsをseparate_rowsワイドフォームに。

library(dplyr) 
library(tidyr) 

df %>% 
    separate_rows(stock) %>% 
    group_by(id) %>% 
    mutate(name = paste("stock", seq_along(stock), sep = "_")) %>% 
    ungroup %>% 
    spread(name, stock) 

与える:

# A tibble: 3 x 3 
    id stock_1 stock_2 
* <dbl>  <chr> <chr> 
1  1 Google Yahoo 
2  2 Microsoft Google 
3  3  Yahoo <NA> 

2)個別の我々はこれ以上2以下のサブフィールドがあったことを知っていたならば、私たちは同じを与えるseparateを使用することができます。

library(dplyr) 
library(tidyr) 

df %>% 
    separate(stock, c("stock_1", "stock_2"), fill = "right") 

3)read.tableをこのアプローチには、パッケージを使用していません。

id stock_1 stock_2 
1 1 Google Yahoo 
2 2 Microsoft Google 
3 3  Yahoo   
2

コメントに答えるために、プラス完全性について別のオプション:

stocks <- read.table(text = as.character(df$stock), sep = ";", as.is = TRUE, fill = TRUE) 
names(stocks) <- paste("stock", seq_along(stocks), sep = "_") 
cbind(df[1], stocks) 

与える

library(splitstackshape) 
cSplit(df, "stock", ";") 
# id stock_1 stock_2 
# 1: 1 Google Yahoo 
# 2: 2 Microsoft Google 
# 3: 3  Yahoo  NA 

data.table

splitstackshape

library(data.table) 
setDT(df)[, c("stock_1", "stock_2") := tstrsplit(stock, ";")][, stock := NULL][] 
# id stock_1 stock_2 
# 1: 1 Google Yahoo 
# 2: 2 Microsoft Google 
# 3: 3  Yahoo  NA 
関連する問題