2

I have one character vector containg below values:

 [1] tBodyAcc-mean()-X           tBodyAcc-mean()-Y           tBodyAcc-mean()-Z           tBodyAcc-std()-X           
 [5] tBodyAcc-std()-Y            tBodyAcc-std()-Z            tGravityAcc-mean()-X        tGravityAcc-mean()-Y       
 [9] tGravityAcc-mean()-Z        tGravityAcc-std()-X         tGravityAcc-std()-Y         tGravityAcc-std()-Z        
[13] tBodyAccJerk-mean()-X       tBodyAccJerk-mean()-Y       tBodyAccJerk-mean()-Z       tBodyAccJerk-std()-X       
[17] tBodyAccJerk-std()-Y        tBodyAccJerk-std()-Z        tBodyGyro-mean()-X          tBodyGyro-mean()-Y         
[21] tBodyGyro-mean()-Z          tBodyGyro-std()-X           tBodyGyro-std()-Y           tBodyGyro-std()-Z          
[25] tBodyGyroJerk-mean()-X      tBodyGyroJerk-mean()-Y      tBodyGyroJerk-mean()-Z      tBodyGyroJerk-std()-X      
[29] tBodyGyroJerk-std()-Y       tBodyGyroJerk-std()-Z       tBodyAccMag-mean()          tBodyAccMag-std()          
[33] tGravityAccMag-mean()       tGravityAccMag-std()        tBodyAccJerkMag-mean()      tBodyAccJerkMag-std()      
[37] tBodyGyroMag-mean()         tBodyGyroMag-std()          tBodyGyroJerkMag-mean()     tBodyGyroJerkMag-std()     
[41] fBodyAcc-mean()-X           fBodyAcc-mean()-Y           fBodyAcc-mean()-Z           fBodyAcc-std()-X           
[45] fBodyAcc-std()-Y            fBodyAcc-std()-Z            fBodyAccJerk-mean()-X       fBodyAccJerk-mean()-Y      
[49] fBodyAccJerk-mean()-Z       fBodyAccJerk-std()-X        fBodyAccJerk-std()-Y        fBodyAccJerk-std()-Z       
[53] fBodyGyro-mean()-X          fBodyGyro-mean()-Y          fBodyGyro-mean()-Z          fBodyGyro-std()-X          
[57] fBodyGyro-std()-Y           fBodyGyro-std()-Z           fBodyAccMag-mean()          fBodyAccMag-std()          
[61] fBodyBodyAccJerkMag-mean()  fBodyBodyAccJerkMag-std()   fBodyBodyGyroMag-mean()     fBodyBodyGyroMag-std()     
[65] fBodyBodyGyroJerkMag-mean() fBodyBodyGyroJerkMag-std() 

And I want to replace name patterns for repl patterns:

l_name_patterns <- c("^t{1}","^f{1}","*BodyBody*","*Body*","*Acc*", "*Gravity*","*Gyro*", "*Mag*", "*Jerk*")
l_repl_patterns <- c("Time ", "Frequency ","Body","Body ","Accelerator ", "Gravity ", "Gyroscope ","Magnitude ", "Jerk ")

I want to do multiple replacements using sub or another similar function, since the sub documentation says:

   pattern: If a character vector of length 2 or more is supplied, the first element is used with a warning. 

I have done it this way:

for ( i in 1:length(l_name_patterns) )
{

  print(l_name_patterns[i])

l_names <- sub( pattern  = l_name_patterns[i]
            , replacement = l_repl_patterns[i]
            , x           = l_names
            )

}

Anyone has a more elegant approach?

Thanks

Andres Alvarado
  • 196
  • 1
  • 11
  • Your "patterns" are not regular expressions. I believe that you need to simply remove all occurrences of `*` characters. – Matthew Lundberg Jan 19 '15 at 23:10
  • Hi @MatthewLundberg , thanks for ur reply, please try this code: l_names <- "My post on StackOverflow" l_pattern <- c("post","My") l_replacement <- c( "tsop", "yM") sub( pattern = l_pattern, replacement = l_replacement, x = l_names ) – Andres Alvarado Jan 19 '15 at 23:57

2 Answers2

3

You could try

library(qdap)
mgsub(l_pattern, l_replacement, l_names)
#[1] "yM tsop on StackOverflow"

For the example in your post

res <- mgsub(l_name_patterns, l_repl_patterns, l_names, fixed=FALSE)
head(res,3)
#[1] "Time Body Accelerator -mean()-X" "Time Body Accelerator -mean()-Y"
#[3] "Time Body Accelerator -mean()-Z"

data

l_names <- "My post on StackOverflow" 
l_pattern <- c("post","My")
l_replacement <- c( "tsop", "yM") 

Example data in the post

l_names <- c("tBodyAcc-mean()-X", "tBodyAcc-mean()-Y", "tBodyAcc-mean()-Z", 
 "tBodyAcc-std()-X", "tBodyAcc-std()-Y", "tBodyAcc-std()-Z", "tGravityAcc-mean()-X", 
 "tGravityAcc-mean()-Y", "tGravityAcc-mean()-Z", "tGravityAcc-std()-X", 
 "tGravityAcc-std()-Y", "tGravityAcc-std()-Z", "tBodyAccJerk-mean()-X", 
  "tBodyAccJerk-mean()-Y", "tBodyAccJerk-mean()-Z", "tBodyAccJerk-std()-X", 
 "tBodyAccJerk-std()-Y", "tBodyAccJerk-std()-Z", "tBodyGyro-mean()-X", 
 "tBodyGyro-mean()-Y", "tBodyGyro-mean()-Z", "tBodyGyro-std()-X", 
 "tBodyGyro-std()-Y", "tBodyGyro-std()-Z", "tBodyGyroJerk-mean()-X", 
 "tBodyGyroJerk-mean()-Y", "tBodyGyroJerk-mean()-Z", "tBodyGyroJerk-std()-X", 
 "tBodyGyroJerk-std()-Y", "tBodyGyroJerk-std()-Z", "tBodyAccMag-mean()", 
 "tBodyAccMag-std()", "tGravityAccMag-mean()", "tGravityAccMag-std()", 
  "tBodyAccJerkMag-mean()", "tBodyAccJerkMag-std()", "tBodyGyroMag-mean()", 
  "tBodyGyroMag-std()", "tBodyGyroJerkMag-mean()", "tBodyGyroJerkMag-std()", 
  "fBodyAcc-mean()-X", "fBodyAcc-mean()-Y", "fBodyAcc-mean()-Z", 
  "fBodyAcc-std()-X", "fBodyAcc-std()-Y", "fBodyAcc-std()-Z", "fBodyAccJerk-mean()-X", 
  "fBodyAccJerk-mean()-Y", "fBodyAccJerk-mean()-Z", "fBodyAccJerk-std()-X", 
  "fBodyAccJerk-std()-Y", "fBodyAccJerk-std()-Z", "fBodyGyro-mean()-X", 
  "fBodyGyro-mean()-Y", "fBodyGyro-mean()-Z", "fBodyGyro-std()-X", 
  "fBodyGyro-std()-Y", "fBodyGyro-std()-Z", "fBodyAccMag-mean()", 
  "fBodyAccMag-std()", "fBodyBodyAccJerkMag-mean()", "fBodyBodyAccJerkMag-std()", 
  "fBodyBodyGyroMag-mean()", "fBodyBodyGyroMag-std()", "fBodyBodyGyroJerkMag-mean()", 
  "fBodyBodyGyroJerkMag-std()")

l_name_patterns <- c("^t{1}","^f{1}","BodyBody","Body","Acc", 
    "Gravity","Gyro", "Mag", "Jerk")
l_repl_patterns <- c("Time ", "Frequency ","Body","Body ","Accelerator ", 
    "Gravity ", "Gyroscope ","Magnitude ", "Jerk ")
akrun
  • 874,273
  • 37
  • 540
  • 662
0

One way to do this is to iterate over the list, each time transforming l_names:

for (i in seq_along(l_name_patterns)) {
  l_names <- sub(l_name_patterns[i], l_repl_patterns[i], l_names)
}
Matthew Lundberg
  • 42,009
  • 6
  • 90
  • 112