[R] Changing entries of column of type "factor"/Adding a new level to a factor
PIKAL Petr
petr.pikal at precheza.cz
Mon Aug 27 16:22:56 CEST 2012
Hi
you could save yourself time to read help page for factor
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of Fridolin
> Sent: Monday, August 27, 2012 12:09 PM
> To: r-help at r-project.org
> Subject: [R] Changing entries of column of type "factor"/Adding a new
> level to a factor
>
> What is a smart way to change an entry inside a column of a dataframe
> or matrix which is of type "factor"?
data.frame is not a matrix
each factor have levels attribute
levels(input$M1)
level 0/0 shall be the first so
levels(input$M1)[1] <-"999/999"
Easiest way is probably cycle through columns of your data
for( i in columns) levels(input[,i])[levels(input[,i])=="0/0"]<-"999/999"
Regards
Petr
>
> Here is my script incl. input data:
> > #set working directory:
> > setwd("K:/R")
> >
> > #read in data:
> > input<-read.table("Exampleinput.txt", sep="\t", header=TRUE)
> >
> > #check data:
> > input
> Ind M1 M2 M3
> 1 1 96/98 120/120 0/0
> 2 2 102/108 120/124 305/305
> 3 3 96/108 120/120 0/0
> 4 4 0/0 116/120 300/305
> 5 5 96/108 120/130 300/305
> 6 6 98/98 116/120 300/305
> 7 7 98/108 120/120 305/305
> 8 8 98/108 120/120 305/305
> 9 9 98/102 120/124 300/300
> 10 10 108/108 120/120 305/305
> > str(input)
> 'data.frame': 10 obs. of 4 variables:
> $ Ind: int 1 2 3 4 5 6 7 8 9 10
> $ M1 : Factor w/ 8 levels "0/0","102/108",..: 5 2 4 1 4 8 7 7 6 3 $
> M2 : Factor w/ 4 levels "116/120","120/120",..: 2 3 2 1 4 1 2 2 3 2 $
> M3 : Factor w/ 4 levels "0/0","300/300",..: 1 4 1 3 3 3 4 4 2 4
> >
> > #replace 0/0 by 999/999:
> > for (r in 1:10)
> + for (c in 2:4)
> + if (input[r,c]=="0/0") input[r,c]<-"999/999"
> Warnmeldungen:
> 1: In `[<-.factor`(`*tmp*`, iseq, value = "999/999") :
> invalid factor level, NAs generated
> 2: In `[<-.factor`(`*tmp*`, iseq, value = "999/999") :
> invalid factor level, NAs generated
> 3: In `[<-.factor`(`*tmp*`, iseq, value = "999/999") :
> invalid factor level, NAs generated
> > input
> Ind M1 M2 M3
> 1 1 96/98 120/120 <NA>
> 2 2 102/108 120/124 305/305
> 3 3 96/108 120/120 <NA>
> 4 4 <NA> 116/120 300/305
> 5 5 96/108 120/130 300/305
> 6 6 98/98 116/120 300/305
> 7 7 98/108 120/120 305/305
> 8 8 98/108 120/120 305/305
> 9 9 98/102 120/124 300/300
> 10 10 108/108 120/120 305/305
>
>
> I want to replace all "0/0" by "999/999". My code should work for
> columns of type "character" and "integer". But to make it work for a
> "factor"-column I would need to add the new level of "999/999" at
> first, I guess. How do I add a new level?
>
>
>
> --
> View this message in context: http://r.789695.n4.nabble.com/Changing-
> entries-of-column-of-type-factor-Adding-a-new-level-to-a-factor-
> tp4641402.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> 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