2013-02-05 11 views
5

का हिस्सा निकालें मेरे पास अक्षांश और देशांतर द्वारा मौसम स्टेशनों और उनके स्थानों की एक सूची है। स्वरूपण समस्या थी और उनमें से कुछ में घंटों और मिनट होते हैं जबकि अन्य में घंटों, मिनट और सेकंड होते हैं। मैं रेगेक्स का उपयोग कर पैटर्न पा सकता हूं लेकिन मुझे अलग-अलग टुकड़ों को निकालने में परेशानी हो रही है।आर regex/gsub: पैटर्न

Station  latHr latMin latSec latDir lonHr lonMin lonSec lonDir 
    1940 K01R 31 08  00  N  092 34  00  W 
    1941 K01T 28 08  00  N  094 24  00  W 
    1942 K03Y 48 47  00  N  096 57  00  W 
    1943 K04V 38 05  50  N  106 10  07  W 
    1944 K05F 31 25  16  N  097 47  49  W 
    1945 K06D 48 53  04  N  099 37  15  W 

मैं इस regex मैच मिल सकता है:

data.format <- "\\d{1,3}-\\d{1,3}(?:-\\d{1,3})?[NSWE]{1}" 
grep(data.format, wthrStat1$lat) 

लेकिन अनिश्चित है कि कैसे प्राप्त करने के लिए कर रहा हूँ

> head(wthrStat1) 
    Station  lat  lon 
1940 K01R 31-08N 092-34W 
1941 K01T 28-08N 094-24W 
1942 K03Y 48-47N 096-57W 
1943 K04V 38-05-50N 106-10-07W 
1944 K05F 31-25-16N 097-47-49W 
1945 K06D 48-53-04N 099-37-15W 

मैं कुछ इस तरह करना चाहते हैं:

यहाँ डेटा है कॉलम में व्यक्तिगत भागों। मैंने कुछ चीजों की कोशिश की है जैसे:

wthrStat1$latHr <- ifelse(grepl(data.format, wthrStat1$lat), gsub(????), NA) 

लेकिन बिना किसी किस्मत के।

> dput(wthrStat1[1:10,]) 
structure(list(Station = c("K01R", "K01T", "K03Y", "K04V", "K05F", 
"K06D", "K07G", "K07S", "K08D", "K0B9"), lat = c("31-08N", "28-08N", 
"48-47N", "38-05-50N", "31-25-16N", "48-53-04N", "42-34-28N", 
"47-58-27N", "48-18-03N", "43-20N"), lon = c("092-34W", "094-24W", 
"096-57W", "106-10-07W", "097-47-49W", "099-37-15W", "084-48-41W", 
"117-25-42W", "102-24-23W", "070-24W")), .Names = c("Station", 
"lat", "lon"), row.names = 1940:1949, class = "data.frame") 

कोई सुझाव:

यहाँ एक dput() है?

+0

क्या आपने रेगेक्स पर फ़ैरेंटिसिस का उपयोग करके * प्रत्येक कॉलम को * समूहबद्ध करने का प्रयास किया है? –

+0

@ ऑस्करमेडरोस: नहीं, आप यह कैसे करेंगे? – screechOwl

+0

मुझे नहीं पता कि 'आर' में रेगेक्स कैसे काम करता है, लेकिन अधिकांश भाषाओं में आप समूह बना सकते हैं जिसमें आपको पैरेंटिसिस के अंदर क्या चाहिए। 'Id = (\ d +)' की तरह। यदि आपका मिलान 'id = 1234 'है, तो पहला समूह' 1234' होगा। –

उत्तर

6

यह अत्यंत अकुशल, मुझे आशा है कि है किसी और बेहतर समाधान था: जो देता है

library(gsubfn) 
data.format <- "(\\d{1,3})-(\\d{1,3})-?(\\d{1,3})?([NSWE]{1})" 
parts <- strapplyc(wthrStat1$lat, data.format, simplify = rbind) 
parts[parts == ""] <- "00" 

:

dat <- read.table(text =' Station  lat  lon 
1940 K01R 31-08N 092-34W 
1941 K01T 28-08N 094-24W 
1942 K03Y 48-47N 096-57W 
1943 K04V 38-05-50N 106-10-07W 
1944 K05F 31-25-16N 097-47-49W 
1945 K06D 48-53-04N 099-37-15W', head=T) 


pattern <- '([0-9]+)[-]([0-9]+)([-|A-Z]+)([0-9]*)([A-Z]*)' 

dat$latHr <- gsub(pattern,'\\1',dat$lat) 
dat$latMin <- gsub(pattern,'\\2',dat$lat) 

latSec <- gsub(pattern,'\\4',dat$lat) 
latSec[nchar(latSec)==0] <- '00' 
dat$latSec <- latSec 

latDir <- gsub(pattern,'\\5',dat$lat) 
latDir[nchar(latDir)==0] <- latDir[nchar(latDir)!=0][1] 
dat$latDir <- latDir 

dat 
    Station  lat  lon latHr latMin latSec latDir 
1940 K01R 31-08N 092-34W 31  08  00  N 
1941 K01T 28-08N 094-24W 28  08  00  N 
1942 K03Y 48-47N 096-57W 48  47  00  N 
1943 K04V 38-05-50N 106-10-07W 38  05  50  N 
1944 K05F 31-25-16N 097-47-49W 31  25  16  N 
1945 K06D 48-53-04N 099-37-15W 48  53  04  N 
7

strapplyc gsubfn पैकेज में कोष्ठकों से घिरा नियमित अभिव्यक्ति में प्रत्येक समूह निकाल देंगे :

> parts 
     [,1] [,2] [,3] [,4] 
[1,] "31" "08" "00" "N" 
[2,] "28" "08" "00" "N" 
[3,] "48" "47" "00" "N" 
[4,] "38" "05" "50" "N" 
[5,] "31" "25" "16" "N" 
[6,] "48" "53" "04" "N" 
[7,] "42" "34" "28" "N" 
[8,] "47" "58" "27" "N" 
[9,] "48" "18" "03" "N" 
[10,] "43" "20" "00" "N" 
+0

gsubfn पैकेज को इंगित करने के लिए धन्यवाद। मैं * लागू कार्यों को विस्तारित करके आर के साथ फिट बैठता हूं। बीटीडब्ल्यू, मेरे लिए, strapplyc 6 पंक्तियों के 1 कॉलम के साथ एक डेटा.फ्रेम देता है जिसमें सभी 'सी' होते हैं। strapply, जबकि भागों <- strapply (डीएफ $ lat, पैटर्न, FUN = सी, सरलीकृत = rbind) अपेक्षित के रूप में काम करता है। (आर 2.15.1 पर gsubfn का संस्करण 0.6-5, यह tcltk नहीं मिला)। – cbare

+1

@cbare, यह एक बग है। अब यह उपversण रेपो में तय है। इसका उपयोग करने के लिए: 'लाइब्रेरी (gsbufn); स्रोत ("http://gsubfn.googlecode.com/svn/trunk/R/strapplyc.R") '। एफएक्यू में tcltk इंस्टॉल करने की जानकारी भी है: https://code.google.com/p/gsubfn/#FAQs –

2

का उपयोग करके एक और जवाब:

# example data 
data <- 
"Station  lat  lon 
1940 K01R 31-08N 092-34W 
1941 K01T 28-08N 094-24W 
1942 K03Y 48-47N 096-57W 
1943 K04V 38-05-50N 106-10-07W 
1944 K05F 31-25-16N 097-47-49W 
1945 K06D 48-53-04N 099-37-15W" 

## read string into a data.frame 
df <- read.table(text=data, head=T, stringsAsFactors=F) 

pattern <- "(\\d{1,3})-(\\d{1,3})(?:-(\\d{1,3}))?([NSWE]{1})" 

library(stringr) 
str_match(df$lat, pattern) 

इस पूरे मिलता जुलता स्ट्रिंग के लिए एक स्तंभ और प्रत्येक पर कब्जा-समूह के लिए एक अतिरिक्त स्तंभ के साथ एक data.frame पैदा करता है।

 [,1]  [,2] [,3] [,4] [,5] 
[1,] "31-08N" "31" "08" "" "N" 
[2,] "28-08N" "28" "08" "" "N" 
[3,] "48-47N" "48" "47" "" "N" 
[4,] "38-05-50N" "38" "05" "-50" "N" 
[5,] "31-25-16N" "31" "25" "-16" "N" 
[6,] "48-53-04N" "48" "53" "-04" "N" 

आर के string processing क्षमता पिछले कुछ वर्षों में एक बहुत प्रगति की है।