[R] how to turn column into column names and fill it with values

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Tue Sep 29 18:46:29 CEST 2020


I am not sure reshape2 is appropriate for this task, but, assuming I
understand correctly, it's quite easy without it. The following is one way,
which probably can be done more elegantly and efficiently, but I think it
does what you want.

"dat" is your example data frame, in which the columns were read in with
"stringsAsFactors" = FALSE (this is important!)

dat <- cbind(dat, matrix(0,ncol = 3)) ## change 3 to 34 for your full data
names(dat) <- c(names(dat)[1:3], unique(dat$PLATE))
for(i in 4:ncol(dat)) dat[,i] <- 1 + (names(dat)[i]== dat$PLATE)
dat

Result:

      FID  IID   PLATE 4RWG569 cherry 5XAV049
1 fam0110 G110 4RWG569       2      1       1
2 fam0113 G113  cherry       1      2       1
3 fam0114 G114  cherry       1      2       1
4 fam0117 G117 4RWG569       2      1       1
5 fam0118 G118 5XAV049       1      1       2
6 fam0119 G119  cherry       1      2       1


Bert Gunter

"The trouble with having an open mind is that people keep coming along and
sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Tue, Sep 29, 2020 at 9:19 AM Ana Marija <sokovic.anamarija using gmail.com>
wrote:

> Hello,
>
> I have a data frame like this:
>
> > head(mc)
>       FID  IID   PLATE
> 1 fam0110 G110 4RWG569
> 2 fam0113 G113  cherry
> 3 fam0114 G114  cherry
> 4 fam0117 G117 4RWG569
> 5 fam0118 G118 5XAV049
> 6 fam0119 G119  cherry
> ...
> > dim(mc)
> [1] 1625    4
> > length(unique(mc$PLATE))
> [1] 34
>
> I am trying to make a new data frame which would look like this:
>       FID  IID   PLATE   4RWG569  cherry 5XAV049 ...
> 1 fam0110 G110 4RWG569  2  1  1
> 2 fam0113 G113  cherry   1  2  1
> 3 fam0114 G114  cherry   1  2  1
> 4 fam0117 G117 4RWG569  2  1  1
> 5 fam0118 G118 5XAV049   2  1  1
> 6 fam0119 G119  cherry   1  2  1
> ...
>
> so the new data frame would have an additional 34 columns (for every
> unique mc$PLATE) and if in the row of PLATE column the value is ==to
> that column name I would have 2 otherwise 1
>
> I tried to do this with:
>
> library(reshape2)
> >  m2=dcast(mc, IID ~ PLATE)
> Using PLATE as value column: use value.var to override.
>
> Please advise,
> Ana
>
> ______________________________________________
> R-help using 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]]



More information about the R-help mailing list