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.
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" <gangchen6 at 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 <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.
[[alternative HTML version deleted]]
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 <istazahn at 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" <gangchen6 at 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 <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. > > [[alternative HTML version deleted]] > >______________________________________________ >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.
how about gdata functions? 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))) tmp.orig=tmp library(gdata) bigMap=mapLevels(x=list(factor(tmp[,"R1"]),factor(tmp[,"R2"])),combine = T,codes=FALSE) mapLevels(tmp[,"R1"]) = bigMap mapLevels(tmp[,"R2"]) = bigMap dd=as.integer(tmp[,"R2"])-as.integer(tmp[,"R1"]) odd=dd%%2!=0 swap=tmp[odd,"R2"] tmp[odd,"R2"]=tmp[odd,"R1"] tmp[odd,"R1"]=swap cbind(tmp,odd,tmp.orig) cheers Peter> On 7. Jul 2017, at 00:54, Gang Chen <gangchen6 at 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 <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. > > ______________________________________________ > 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.