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
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 <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
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
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 <istazahn at 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 <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
>> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.