2016-04-18 17 views
0

私はデータフレームの列を3つの別々の列に分割しようとしていました。私は正常に2つの目的の列に分割することができましたが、日付(年のみ)を抽出するのに問題があります。 これは私が望んでいた列の2に列を分割するために使用するコードです:リストから日付のみを抽出する

wines$Winery <- lapply(strsplit(as.character(wines$wine), "[0-9]{4}"), "[", 1) 
wines$Name <- lapply(strsplit(as.character(wines$wine), "[0-9]{4}"), "[", 2) 

私はすべての非数字文字を取り除くためにGSUBを使用してみましたが、しかし私にはない数字がありますつかみたい私が望むのは、列の中心から4桁の年であり、すべての行に1年の列があるわけではありません。

#   winery            wine 
# 1 Charles Smith    Charles Smith 2012 Royal City Syrah 
# 2  K Vintners     K Vintners 2012 Cattle King Syrah 
# 3  K Vintners      K Vintners 2012 Klein Syrah 
# 4 Two Vintners    Two Vintners 2013 Make Haste Cinsault 
# 5  K Vintners     K Vintners 2012 The Hidden Syrah 
# 6   Kerloo      Kerloo 2013 Stone Tree Malbec 
# 7 Betz Family  Betz Family 2012 Le Parrain Cabernet Sauvignon 
# 8   Kerloo Kerloo 2013 Stone Tree Vineyard Cabernet Sauvignon 
# 9   Efeste   Efeste 2012 Big Papa Cabernet Sauvignon 
# 10 Two Vintners  Two Vintners 2013 Boushey Vineyard Orenache 
# 11 K Vintners    K Vintners 2012 Morrison Lane Syrah 
# 12 K Vintners     K Vintners 2012 The Creator Red 

このデータは、Webスクレイピングを通じて収集されたので、私は、データがどのように見えるかの画像が含まれていたが、1000以上の行

wines <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "winery wine 
'Charles Smith' 'Charles Smith 2012 Royal City Syrah' 
'K Vintners' 'K Vintners 2012 Cattle King Syrah' 
'K Vintners' 'K Vintners 2012 Klein Syrah' 
'Two Vintners' 'Two Vintners 2013 Make Haste Cinsault' 
'K Vintners' 'K Vintners 2012 The Hidden Syrah' 
Kerloo 'Kerloo 2013 Stone Tree Malbec' 
'Betz Family' 'Betz Family 2012 Le Parrain Cabernet Sauvignon' 
Kerloo 'Kerloo 2013 Stone Tree Vineyard Cabernet Sauvignon' 
Efeste 'Efeste 2012 Big Papa Cabernet Sauvignon' 
'Two Vintners' 'Two Vintners 2013 Boushey Vineyard Orenache' 
'K Vintners' 'K Vintners 2012 Morrison Lane Syrah' 
'K Vintners' 'K Vintners 2012 The Creator Red'") 
+0

コードを実験するために使用できる形式で入力する方がよいでしょう。イメージはそのタスクには役に立ちません。 – Gopala

+0

これを行う: 'dput(head(wines、15))'と出力をあなたの質問に追加してください。 – Abdou

+1

最終的に 'read.csv(text = gsub( '(?= \\ d {4})|(?<= \\ d {4})'、 '、'、ワイン$ wine、perl '' do - do.call( 'rbind'、strsplit(ワイン$ワイン、ワイン$ワイン)、ヘッダー= FALSE) ' – rawr

答えて

2
wines <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "winery wine 
'Charles Smith' 'Charles Smith 2012 Royal City Syrah' 
'K Vintners' 'K Vintners 2012 Cattle King Syrah' 
'K Vintners' 'K Vintners 2012 Klein Syrah' 
'Two Vintners' 'Two Vintners 2013 Make Haste Cinsault' 
'K Vintners' 'K Vintners 2012 The Hidden Syrah' 
Kerloo 'Kerloo 2013 Stone Tree Malbec' 
'Betz Family' 'Betz Family 2012 Le Parrain Cabernet Sauvignon' 
Kerloo 'Kerloo 2013 Stone Tree Vineyard Cabernet Sauvignon' 
Efeste 'Efeste 2012 Big Papa Cabernet Sauvignon' 
'Two Vintners' 'Two Vintners 2013 Boushey Vineyard Orenache' 
'K Vintners' 'K Vintners 2012 Morrison Lane Syrah' 
'K Vintners' 'K Vintners 2012 The Creator Red'") 
データがあります

日付を取得するには、すべての非数字文字を除外することができます

などにより210はあなたの文字列

do.call('rbind', strsplit(wines$wine, ' (?=\\d{4})|(?<=\\d{4}) ', perl = TRUE)) 
#  [,1]   [,2] [,3]          
# [1,] "Charles Smith" "2012" "Royal City Syrah"      
# [2,] "K Vintners" "2012" "Cattle King Syrah"      
# [3,] "K Vintners" "2012" "Klein Syrah"       
# [4,] "Two Vintners" "2013" "Make Haste Cinsault"     
# [5,] "K Vintners" "2012" "The Hidden Syrah"      
# [6,] "Kerloo"  "2013" "Stone Tree Malbec"      
# [7,] "Betz Family" "2012" "Le Parrain Cabernet Sauvignon"   
# [8,] "Kerloo"  "2013" "Stone Tree Vineyard Cabernet Sauvignon" 
# [9,] "Efeste"  "2012" "Big Papa Cabernet Sauvignon"   
# [10,] "Two Vintners" "2013" "Boushey Vineyard Orenache"    
# [11,] "K Vintners" "2012" "Morrison Lane Syrah"     
# [12,] "K Vintners" "2012" "The Creator Red" 

を分割するか、このように周りの仕事を使用することができます

read.csv(text = gsub(' (?=\\d{4})|(?<=\\d{4}) ', ',', wines$wine, perl = TRUE), header = FALSE) 

#    V1 V2          V3 
# 1 Charles Smith 2012      Royal City Syrah 
# 2  K Vintners 2012      Cattle King Syrah 
# 3  K Vintners 2012       Klein Syrah 
# 4 Two Vintners 2013     Make Haste Cinsault 
# 5  K Vintners 2012      The Hidden Syrah 
# 6   Kerloo 2013      Stone Tree Malbec 
# 7 Betz Family 2012   Le Parrain Cabernet Sauvignon 
# 8   Kerloo 2013 Stone Tree Vineyard Cabernet Sauvignon 
# 9   Efeste 2012   Big Papa Cabernet Sauvignon 
# 10 Two Vintners 2013    Boushey Vineyard Orenache 
# 11 K Vintners 2012     Morrison Lane Syrah 
# 12 K Vintners 2012      The Creator Red 
+0

日付がない行にはNVが含まれているようですが、 '=(NV =))、(perl = TRUE)) '(?= \\ d {4})| NとVの間で分割されています。NV全体が日付の列に終わるようにする方法はありますか?たとえば、 '14 Hands NV Brut Methode Champenoise Sparkling'の行に書かれています。 –

+0

@JamieLeigh:その要件は質問の一部でなければなりません。 –

+0

@JamieLeighは '\\ d'の代わりに' \\ d {4} | NV'を使うだけですか? – rawr

1

(基本的には上記と同じである)一度にすべてを取得します:データ内に見つからないカスタム区切り文字列(たとえば、gsub("\\s*(\\d{4}|\\bNV\\b)\\s*","#-#\\1#-#", wines$wine)で4桁のチャンクを囲み、NVを全単語として使用します(the regex demoを参照)で分割する必要があるすべての部分文字列を置き換え、そのパターンで分割します。

wines <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "winery wine 
'Charles Smith' 'Charles Smith 2012 Royal City Syrah' 
'K Vintners' 'K Vintners 2012 Cattle King Syrah' 
'K Vintners' 'K Vintners 2012 Klein Syrah' 
'Two Vintners' 'Two Vintners 2013 Make Haste Cinsault' 
'K Vintners' 'K Vintners 2012 The Hidden Syrah' 
Kerloo 'Kerloo 2013 Stone Tree Malbec' 
'Betz Family' 'Betz Family 2012 Le Parrain Cabernet Sauvignon' 
Kerloo 'Kerloo 2013 Stone Tree Vineyard Cabernet Sauvignon' 
Efeste 'Efeste 2012 Big Papa Cabernet Sauvignon' 
'Two Vintners' 'Two Vintners 2013 Boushey Vineyard Orenache' 
'K Vintners' 'K Vintners 2012 Morrison Lane Syrah' 
'K Vintners' 'K Vintners 2012 The Creator Red' 
'K Vintners2' '14 Hands NV Brut Methode Champenoise Sparkling' 
") 
wines$wine <- gsub("\\s*(\\d{4}|\\bNV\\b)\\s*","#-#\\1#-#", wines$wine, perl=T) 
do.call('rbind', strsplit(as.character(wines$wine),'#-#',fixed=TRUE)) 
## [,1]   [,2] [,3]          
## [1,] "Charles Smith" "2012" "Royal City Syrah"      
## [2,] "K Vintners" "2012" "Cattle King Syrah"      
## [3,] "K Vintners" "2012" "Klein Syrah"       
## [4,] "Two Vintners" "2013" "Make Haste Cinsault"     
## [5,] "K Vintners" "2012" "The Hidden Syrah"      
## [6,] "Kerloo"  "2013" "Stone Tree Malbec"      
## [7,] "Betz Family" "2012" "Le Parrain Cabernet Sauvignon"   
## [8,] "Kerloo"  "2013" "Stone Tree Vineyard Cabernet Sauvignon" 
## [9,] "Efeste"  "2012" "Big Papa Cabernet Sauvignon"   
##[10,] "Two Vintners" "2013" "Boushey Vineyard Orenache"    
##[11,] "K Vintners" "2012" "Morrison Lane Syrah"     
##[12,] "K Vintners" "2012" "The Creator Red"      
##[13,] "14 Hands"  "NV" "Brut Methode Champenoise Sparkling" 
関連する問題