[R] How to remove square brackets, etc. from address strings?

Sabina Arndt sabina.arndt at hotmail.de
Sun May 27 18:29:48 CEST 2012


Hello r-help members,

I'm very grateful for the reply which Sarah Goslee sent to me in such a 
prompt and helpful manner.
It took me some time, but with a few amendments her suggestion now works 
not only for an example but for my entire data file as well:

 > results
   [1] "GERMANY"         "GERMANY"         "GERMANY"        "GERMANY"
   [5] "GERMANY"         "GERMANY"         "GERMANY"        "GERMANY"
...

Thank you very much for that, dear Sarah!

All these names actually belong to the very first record, though, which 
contains eight addresses instead of only one:

 > testdata[1]
   [1] "[Engel, Kathrin M. Y.; Schroeck, Kristin; Schoeneberg, Torsten; 
Schulz, Angela] Univ Leipzig, Fac Med, Inst Biochem, Leipzig, Germany; 
[Teupser, Daniel; Holdt, Lesca Miriam; Thiery, Joachim] Univ Leipzig, 
Fac Med, Inst Lab Med Clin Chem & Mol Diagnost, Leipzig, Germany; 
[Toenjes, Anke; Kern, Matthias; Blueher, Matthias; Stumvoll, Michael] 
Univ Leipzig, Fac Med, Dept Internal Med, Leipzig, Germany; [Dietrich, 
Kerstin; Kovacs, Peter] Univ Leipzig, Fac Med, Interdisciplinary Ctr 
Clin Res, Leipzig, Germany; [Kruegel, Ute] Univ Leipzig, Fac Med, Rudolf 
Boehm Inst Pharmacol & Toxicol, Leipzig, Germany; [Scheidt, Holger A.; 
Schiller, Juergen; Huster, Daniel] Univ Leipzig, Fac Med, Inst Med Phys 
& Biophys, Leipzig, Germany; [Brockmann, Gudrun A.] Humboldt Univ, Inst 
Anim Sci, D-10099 Berlin, Germany; [Augustin, Martin] Ingenium 
Pharmaceut AG, Martinsried, Germany"
 > results[1]
   [1] "GERMANY"

How can I put the country names back into their original lines / order?
This is an example of the correct result I'd like to receive:

 > results[1]
   [1] "GERMANY" "GERMANY" "GERMANY" "GERMANY" "GERMANY" "GERMANY" 
"GERMANY" "GERMANY"

How can I achieve this result?

I think counting the semicolons outside square brackets - i.e. the ones 
before a "[" but behind a "]" would be helpful in this regard, but I'm 
not sure how to do that, unfortunately. These semicolons directly follow 
the country names, like this, e.g.: "... Germany; [..."
If I add "+ 1" to their number it results in the number of addresses for 
each record / line.

Thank you very much in advance!

Faithfully yours,

Sabina Arndt


Am 26.05.2012 00:19, schrieb Sarah Goslee:
> Part of your problem is that your regexes have spaces in them, so
> that's what you're matching.
>
> A small reproducible example would be more useful. I'm not feeling
> inclined to wade through all your linked files on Friday evening, but
> see if this helps:
>
>> testdata<- "[Engel, Kathrin M. Y.; Schroeck, Kristin; Schoeneberg, Torsten; Schulz, Angela] Univ Leipzig, Fac Med, Inst Biochem, Leipzig, New Zealand; [Teupser, Daniel; Holdt, Lesca Miriam; Thiery, Joachim] Univ Leipzig, Fac Med, Inst Lab Med Clin Chem&  Mol Diagnost, Leipzig, USA; [Toenjes, Anke; Kern, Matthias; Blueher, Matthias; Stumvoll, Michael] Univ Leipzig, Fac Med, Dept Internal Med, Leipzig, Germany; [Dietrich, Kerstin; Kovacs, Peter] Univ Leipzig, Fac Med, Interdisciplinary Ctr Clin Res, Leipzig, Germany; [Kruegel, Ute] Univ Leipzig, Fac Med, Rudolf Boehm Inst Pharmacol&  Toxicol, Leipzig, Germany; [Scheidt, Holger A.; Schiller, Juergen; Huster, Daniel] Univ Leipzig, Fac Med, Inst Med Phys&  Biophys, Leipzig, Germany; [Brockmann, Gudrun A.] Humboldt Univ, Inst Anim Sci, D-10099 Berlin, Germany; [Augustin, Martin] Ingenium Pharmaceut AG, Martinsried, Germany"
>> results<- gsub("\\[.*?\\]", "", testdata)
>> results<- unlist(strsplit(results, ";"))
>> results<- sapply(results, function(x)sub("^.*, ([A-Za-z ]*)$", "\\1", x))
>> names(results)<- NULL
>> results
> [1] "New Zealand" "USA"         "Germany"     "Germany"     "Germany"
>     "Germany"     "Germany"     "Germany"
>
>
> Sarah
>
> On Fri, May 25, 2012 at 4:31 PM, Sabina Arndt<sabina.arndt at hotmail.de>  wrote:
>> Hello r-help members,
>>
>> the solutions which Sarah Goslee and arun sent to me in such a prompt and
>> helpful manner work well with the examples I cut from the data.frame I'm
>> analyzing. Thank you very much for that!
>> I incorporated them into my R-script and discovered that it still doesn't
>> work properly, unfortunately. I have no idea why that's the case.
>> You see, I want to extract country names from the contents of tab-delimited
>> text files. This is an example of the data I'm using:
>> http://pastebin.com/mYZNDXg6
>> This is the script I'm using to import the data:
>> http://pastebin.com/Z10UUH3z (It requires the text files to be in a folder
>> which doesn't contain any other .txt files.)
>> This is the script I'm using to extract the country names:
>> http://pastebin.com/G37fuPba
>> This is the string that's in the relevant field of the first record I'm
>> working on:
>>
>> [Engel, Kathrin M. Y.; Schroeck, Kristin; Schoeneberg, Torsten; Schulz,
>> Angela] Univ Leipzig, Fac Med, Inst Biochem, Leipzig, Germany; [Teupser,
>> Daniel; Holdt, Lesca Miriam; Thiery, Joachim] Univ Leipzig, Fac Med, Inst
>> Lab Med Clin Chem&  Mol Diagnost, Leipzig, Germany; [Toenjes, Anke; Kern,
>> Matthias; Blueher, Matthias; Stumvoll, Michael] Univ Leipzig, Fac Med, Dept
>> Internal Med, Leipzig, Germany; [Dietrich, Kerstin; Kovacs, Peter] Univ
>> Leipzig, Fac Med, Interdisciplinary Ctr Clin Res, Leipzig, Germany;
>> [Kruegel, Ute] Univ Leipzig, Fac Med, Rudolf Boehm Inst Pharmacol&  Toxicol,
>> Leipzig, Germany; [Scheidt, Holger A.; Schiller, Juergen; Huster, Daniel]
>> Univ Leipzig, Fac Med, Inst Med Phys&  Biophys, Leipzig, Germany;
>> [Brockmann, Gudrun A.] Humboldt Univ, Inst Anim Sci, D-10099 Berlin,
>> Germany; [Augustin, Martin] Ingenium Pharmaceut AG, Martinsried, Germany
>>
>> This is the incorrect result my extraction script gives me for the first
>> record:
>>
>>> C1s[1]
>>   [1] "[ENGEL,  KATHRIN M. Y." "KRISTIN"                "TORSTEN"
>>   [4] "GERMANY"                "DANIEL"                 "LESCA MIRIAM"
>>   [7] "GERMANY"                "ANKE"                   "MATTHIAS"
>> [10] "MATTHIAS"               "GERMANY"                "KERSTIN"
>> [13] "GERMANY"                "GERMANY"                "[SCHEIDT,  HOLGER
>> A."
>> [16] "JUERGEN"                "GERMANY"                "HUMBOLDT"
>> [19] "GERMANY"
>>
>> For some reason the first and sixth pair of the eight square brackets are
>> not removed ... Do you understand why?
>> Instead I'd like to get this result, though:
>>
>>> C1s[1]
>>   [1] "GERMANY"        "GERMANY"        "GERMANY"
>>   [4] "GERMANY"        "GERMANY"        "GERMANY"
>>   [7] "HUMBOLDT"        "GERMANY"
>>
>> What am I doing wrong? What are the errors in my R-script?
>> Would anybody be so kind as to take a look and help me out, please?
>> Thank you very much in advance!
>>
>> Faithfully yours,
>>
>> Sabina Arndt



More information about the R-help mailing list