I am working on modifying a REDCap survey. The data dictionary column for the response field has the following value. 1, Strongly disagree | 2, Disagree | 3, Agree | 4, Strongly Agree | 5, Don't Know | 6, Refuse to Answer | 7, Not Applicable I am wanting to convert this so that it looks as follows: 1, A. Strongly disagree | 2, B. Disagree | 3, C. Agree | 4, D. Strongly Agree | 5, E. Don't Know | 6, F. Refuse to Answer | 7, G. Not Applicable Not all responses have these same values. Some questions are Yes/No answers and some have up to 13 different response options. I have been trying to use the sub function to do this, but with no real success. I would appreciate any help that you can give. If you need more information, let me know. Thanks! Thomas -- View this message in context: http://r.789695.n4.nabble.com/replacing-a-character-string-tp4639903.html Sent from the R help mailing list archive at Nabble.com.
Hello, I believe I don't understand your problem. Is this your input datum? x <- "1, Strongly disagree | 2, Disagree | 3, Agree | 4, Strongly Agree | 5, Don't Know | 6, Refuse to Answer | 7, Not Applicable" If so the following will do it: (search <- paste("(", 1:7, ",)", sep = "")) (replace <- paste("\\1 ", LETTERS[1:7], ".", sep = "")) xx <- x for(i in 1:7) xx <- gsub(search[i], replace[i], xx) xx If not, say so. My doubt is in the input. Is the vertical bar a newline or row marker? And the comma? Hope this helps, Rui Barradas Em 10-08-2012 15:18, toehanus escreveu:> I am working on modifying a REDCap survey. The data dictionary column for > the response field has the following value. > > 1, Strongly disagree | 2, Disagree | 3, Agree | 4, Strongly Agree | 5, Don't > Know | 6, Refuse to Answer | 7, Not Applicable > > I am wanting to convert this so that it looks as follows: > > 1, A. Strongly disagree | 2, B. Disagree | 3, C. Agree | 4, D. Strongly > Agree | 5, E. Don't Know | 6, F. Refuse to Answer | 7, G. Not Applicable > > Not all responses have these same values. Some questions are Yes/No answers > and some have up to 13 different response options. I have been trying to > use the sub function to do this, but with no real success. I would > appreciate any help that you can give. If you need more information, let me > know. Thanks! > > Thomas > > > > -- > View this message in context: http://r.789695.n4.nabble.com/replacing-a-character-string-tp4639903.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
On Aug 10, 2012, at 7:18 AM, toehanus wrote:> I am working on modifying a REDCap survey. The data dictionary > column for > the response field has the following value. > > 1, Strongly disagree | 2, Disagree | 3, Agree | 4, Strongly Agree | > 5, Don't > Know | 6, Refuse to Answer | 7, Not Applicable > > I am wanting to convert this so that it looks as follows: > > 1, A. Strongly disagree | 2, B. Disagree | 3, C. Agree | 4, D. > Strongly > Agree | 5, E. Don't Know | 6, F. Refuse to Answer | 7, G. Not > Applicable > > Not all responses have these same values. Some questions are Yes/No > answers > and some have up to 13 different response options. I have been > trying to > use the sub function to do this, but with no real success. I would > appreciate any help that you can give. If you need more > information, let me > know. Thanks! >txt <- "1, Strongly disagree | 2, Disagree | 3, Agree | 4, Strongly Agree | 5, Don't Know | 6, Refuse to Answer | 7, Not Applicable" (If your reader inserts carriage returns, you will need to take them out by hand.) strsplit(txt, split="[[:digit:]]\\,\\s" ) [[1]] [1] "" "Strongly disagree | " "Disagree | " "Agree | " [5] "Strongly Agree | " "Don't Know | " "Refuse to Answer | " "Not Applicable" > stxt <- .Last.value paste0( seq_along(stxt[[1]][-1]), ", ", LETTERS[seq_along(stxt[[1]][-1])], ". ", stxt[[1]][-1], collapse="") [1] "1, A. Strongly disagree | 2, B. Disagree | 3, C. Agree | 4, D. Strongly Agree | 5, E. Don't Know | 6, F. Refuse to Answer | 7, G. Not Applicable" If you didn't want it all as one string, then take out the collapse argument: > paste0( seq_along(stxt[[1]][-1]), ", ", LETTERS[seq_along(stxt[[1]] [-1])], ". ", stxt[[1]][-1]) [1] "1, A. Strongly disagree | " "2, B. Disagree | " "3, C. Agree | " [4] "4, D. Strongly Agree | " "5, E. Don't Know | " "6, F. Refuse to Answer | " [7] "7, G. Not Applicable" You might need to do another pass to take out the "|" characters, although that could also have been accomplished by splitting on a pattern that included it: strsplit(txt, split="(\\|\\s)?[[:digit:]]\\,\\s" ) -- David Winsemius, MD Alameda, CA, USA