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