No, that would remap B to A. Convert to character before doing this, then back to factors. -- Sent from my phone. Please excuse my brevity.
On July 6, 2017 4:43:00 PM PDT, Ista Zahn <istaz...@gmail.com> wrote: >Untested, but I expect that setting the levels to be the same across >the >two factors > >levels(tmp$R1) <- levels(tmp$R2) <- LETTERS[1:6] > >and proceeding as before should be fine. > >Best, >Ista > >On Jul 6, 2017 6:54 PM, "Gang Chen" <gangch...@gmail.com> wrote: > >Thanks a lot, Ista! I really appreciate it. > >How about a slightly different case as the following: > >set.seed(1) >(tmp <- data.frame(x = 1:10, R1 = sample(LETTERS[1:5], 10, replace = > TRUE), R2 = sample(LETTERS[2:6], 10, replace = TRUE))) > > x R1 R2 > 1 C B > 2 B B > 3 C E > 4 E C > 5 E B > 6 D E > 7 E E > 8 D F > 9 C D > 10 A E > >Notice that the factor levels between the two factors, R1 and R2, >slide by one level; that is, factor R1 does not have level F while >factor R2 does not have level A. I want to swap the factor levels >based on the combined levels of the two factors as shown below: > >tl <- unique(c(levels(tmp$R1), levels(tmp$R2))) >for(ii in 1:dim(tmp)[1]) { > kk <- which(tl %in% tmp[ii,'R2'], arr.ind = TRUE) - which(tl %in% > tmp[ii,'R1'], arr.ind = TRUE) > if(kk%%2!=0) { # swap the their levels between the two factors > qq <- tmp[ii,]$R1 > tmp[ii,]$R1 <- tmp[ii,]$R2 > tmp[ii,]$R2 <- qq > } >} > >How to go about this case? Thanks! > > >On Thu, Jul 6, 2017 at 5:16 PM, Ista Zahn <istaz...@gmail.com> wrote: >> How about >> >> foo <- with(list(r1 = tmp$R1, >> r2 = tmp$R2, >> swapme = (as.numeric(tmp$R1) - as.numeric(tmp$R2)) >%% 2 >!= 0), >> { >> tmp[swapme, "R1"] <- r2[swapme] >> tmp[swapme, "R2"] <- r1[swapme] >> tmp >> }) >> >> Best, >> Ista >> >> On Thu, Jul 6, 2017 at 4:06 PM, Gang Chen <gangch...@gmail.com> >wrote: >>> Suppose that we have the following dataframe: >>> >>> set.seed(1) >>> (tmp <- data.frame(x = 1:10, R1 = sample(LETTERS[1:5], 10, replace = >>> TRUE), R2 = sample(LETTERS[1:5], 10, replace = TRUE))) >>> >>> x R1 R2 >>> 1 1 B B >>> 2 2 B A >>> 3 3 C D >>> 4 4 E B >>> 5 5 B D >>> 6 6 E C >>> 7 7 E D >>> 8 8 D E >>> 9 9 D B >>> 10 10 A D >>> >>> I want to do the following: if the difference between the level >index >>> of factor R1 and that of factor R2 is an odd number, the levels of >the >>> two factors need to be switched between them, which can be performed >>> through the following code: >>> >>> for(ii in 1:dim(tmp)[1]) { >>> kk <- which(levels(tmp$R2) %in% tmp[ii,'R2'], arr.ind = TRUE) - >>> which(levels(tmp$R1) %in% tmp[ii,'R1'], arr.ind = TRUE) >>> if(kk%%2!=0) { # swap the their levels between the two factors >>> qq <- tmp[ii,]$R1 >>> tmp[ii,]$R1 <- tmp[ii,]$R2 >>> tmp[ii,]$R2 <- qq >>> } >>> } >>> >>> More concise and efficient way to do this? >>> >>> Thanks, >>> Gang >>> >>> ______________________________________________ >>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> 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. > > [[alternative HTML version deleted]] > >______________________________________________ >R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >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. ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.