# [R] Efficient swapping

Gang Chen gangchen6 at gmail.com
Fri Jul 7 00:54:13 CEST 2017

```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
}
}

On Thu, Jul 6, 2017 at 5:16 PM, Ista Zahn <istazahn at gmail.com> wrote:
>
> 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 <gangchen6 at 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 at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help