[R] Recode factor into binary factor-level vars
David Winsemius
dwinsemius at comcast.net
Sat Mar 7 15:43:17 CET 2009
Sören;
You need to somehow add back to the information that is in "l" that
fact that it was sampled from a set with 4 elements. Since you didn't
sample from a factor the level information was lost. Otherwise, you
coud create that list with unique(l) which in this case only returns 3
elements:
set.l <- c("locA", "locB", "locC", "locD")
sapply(set.l, function(x) l == x)
locA locB locC locD
[1,] FALSE FALSE FALSE TRUE
[2,] FALSE FALSE FALSE TRUE
[3,] FALSE FALSE FALSE TRUE
[4,] FALSE FALSE FALSE TRUE
[5,] FALSE TRUE FALSE FALSE
[6,] TRUE FALSE FALSE FALSE
[7,] TRUE FALSE FALSE FALSE
[8,] TRUE FALSE FALSE FALSE
[9,] FALSE FALSE FALSE TRUE
[10,] TRUE FALSE FALSE FALSE
Its in the wrong orientation because "l" is actually a column vector,
so t() fixes that and adding 0 to TRUE/FALSE returns 0/1:
t(sapply(set.l, function(x) x == l))+0
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
locA 0 0 0 0 0 1 1 1 0 1
locB 0 0 0 0 1 0 0 0 0 0
locC 0 0 0 0 0 0 0 0 0 0
locD 1 1 1 1 0 0 0 0 1 0
m <- as.data.frame(t(sapply(set.l, function(x) l == x))+0)
m
The one-liner would be:
m <- as.data.frame(t(sapply(c("locA", "locB", "locC", "locD"),
function(x) l == x))+0)
You canalso you mapply but the result does not have the desired row
names and the column names are the result of the sampling whcih seems
to me potentially confusing:
> mapply(function(x) x==set.l, l)+0
locD locD locD locD locB locA locA locA locD locA
[1,] 0 0 0 0 0 1 1 1 0 1
[2,] 0 0 0 0 1 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0
[4,] 1 1 1 1 0 0 0 0 1 0
I see that Dimitris has already given you a perfectly workable
solution, but these seem to tackle the problem from a different angle.
--
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
On Mar 7, 2009, at 8:39 AM, soeren.vogel at eawag.ch wrote:
> How to I "recode" a factor into a binary data frame according to the
> factor levels:
>
> ### example:start
> set.seed(20)
> l <- sample(rep.int(c("locA", "locB", "locC", "locD"), 100), 10,
> replace=T)
> # [1] "locD" "locD" "locD" "locD" "locB" "locA" "locA" "locA" "locD"
> "locA"
> ### example:end
>
> What I want in the end is the following:
>
> m$locA: 0, 0, 0, 0, 0, 1, 1, 1, 0, 1
> m$locB: 0, 0, 0, 0, 1, 0, 0, 0, 0, 0
> m$locC: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
> m$locD: 1, 1, 1, 1, 0, 0, 0, 0, 1, 0
>
> Instead of 0, NA's would also be fine.
>
> Thanks, Sören
>
> --
> Sören Vogel, PhD-Student, Eawag, Dept. SIAM
> http://www.eawag.ch, http://sozmod.eawag.ch
>
> ______________________________________________
> 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