[R] transform 3 numeric vectors empty of 0/1

arun smartpink111 at yahoo.com
Tue Jun 18 20:19:43 CEST 2013


Hi,
You could also use:
dat1<- data.frame(Vec1,Vec2,Vec3)
Reduce(paste0,lapply(seq_len(ncol(dat1)),function(i) {x1<- as.character(factor(dat1[,i],labels=c("",LETTERS[i])))}))
# [1] "ABC" "ABC" ""    "AC"  "AB"  "ABC" "A"   "B"   "ABC" "AC"  "B"   "A"  
#[13] "AB"  "C"   "B"  
#or
library(plyr)
library(car)
dat2<-colwise(recode)(dat1,recodes="1='ABC';0=''")
 Reduce(paste0,lapply(seq_len(ncol(dat2)),function(i) substr(dat2[,i],i,i)))
# [1] "ABC" "ABC" ""    "AC"  "AB"  "ABC" "A"   "B"   "ABC" "AC"  "B"   "A"  
#[13] "AB"  "C"   "B"  

#or
 paste0(recode(Vec1,'1="A";0=""'),recode(Vec2,'1="B";0=""'),recode(Vec3,'1="C";0=""'))
# [1] "ABC" "ABC" ""    "AC"  "AB"  "ABC" "A"   "B"   "ABC" "AC"  "B"   "A"  
#[13] "AB"  "C"   "B"  



#Speed comparisons:
set.seed(42)
 Vec1 <- sample(0:1, 1e6, replace=TRUE)
 Vec2 <- sample(0:1, 1e6, replace=TRUE)
 Vec3 <- sample(0:1, 1e6, replace=TRUE)
system.time(res<- paste0(ifelse(Vec1,"A",""), ifelse(Vec2,"B",""),ifelse(Vec3,"C","")))
# user  system elapsed 
#  2.028   0.020   2.051 

set.seed(42)
system.time(res1<-Reduce(paste0,lapply(1:3,function(i) {x1<- as.character(factor(sample(0:1,1e6,replace=TRUE),labels=c("",LETTERS[i])))})))
 #user  system elapsed 
 # 1.216   0.000   1.219 


dat1<- data.frame(Vec1,Vec2,Vec3)
system.time(res2<-Reduce(paste0,lapply(seq_len(ncol(dat1)),function(i) {x1<- as.character(factor(dat1[,i],labels=c("",LETTERS[i])))})))
 #  user  system elapsed 
 # 1.256   0.000   1.257 

system.time({
dat2<-colwise(recode)(dat1,recodes="1='ABC';0=''")
 res3<-Reduce(paste0,lapply(seq_len(ncol(dat2)),function(i) substr(dat2[,i],i,i)))
})
# user  system elapsed 
#  2.232   0.008   2.249 
 system.time(res4<-paste0(recode(Vec1,'1="A";0=""'),recode(Vec2,'1="B";0=""'),recode(Vec3,'1="C";0=""')))
 #  user  system elapsed 
 # 1.716   0.012   1.728 


identical(res1,res)
#[1] TRUE
identical(res,res2)
#[1] TRUE
 identical(res,res3)
#[1] TRUE
identical(res,res4)
#[1] TRUE

A.K.


----- Original Message -----
From: David Carlson <dcarlson at tamu.edu>
To: 'Arnaud Michel' <michel.arnaud at cirad.fr>; r-help at r-project.org
Cc: 
Sent: Tuesday, June 18, 2013 1:08 PM
Subject: Re: [R] transform 3 numeric vectors empty of 0/1

Try this

> set.seed(42)
> Vec1 <- sample(0:1, 15, replace=TRUE)
> Vec2 <- sample(0:1, 15, replace=TRUE)
> Vec3 <- sample(0:1, 15, replace=TRUE)
> paste0(ifelse(Vec1,"A",""), ifelse(Vec2,"B",""),
ifelse(Vec3,"C",""))
[1] "ABC" "ABC" ""    "AC"  "AB"  "ABC" "A"   "B"   "ABC" "AC"  "B"
"A"  
[13] "AB"  "C"   "B"  

-------------------------------------
David L Carlson
Associate Professor of Anthropology
Texas A&M University
College Station, TX 77840-4352


-----Original Message-----
From: r-help-bounces at r-project.org
[mailto:r-help-bounces at r-project.org] On Behalf Of Arnaud Michel
Sent: Tuesday, June 18, 2013 11:58 AM
To: r-help at r-project.org
Subject: [R] transform 3 numeric vectors empty of 0/1

Dear all,
Without a loop, I would like transform 3 numeric vectors empty of
0/1 of 
same length
Vec1 : transform 1 to A and 0 to ""
Vec2 : transform 1 to B and 0 to ""
Vec3 : transform 1 to C and 0 to ""
to obtain only 1 vector Vec who is the paste of the 3 vectors (Ex :
ABC, 
BC, AC, AB,...)
Any idea ?
Thank you for your help

-- 
Michel ARNAUD

______________________________________________
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.

______________________________________________
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.




More information about the R-help mailing list