I much prefer the factor function over the as.factor function for converting character to factor, since you can set the levels in the order you want them to be. -- Sent from my phone. Please excuse my brevity. On March 4, 2016 10:07:27 AM PST, Sarah Goslee <sarah.goslee at gmail.com> wrote:>As everyone has been telling you, as.factor(). >If you like the mutate approach, you can call as.factor(test$subject) >to convert it. > >Here's a one-liner with reproducible data. > > >testdata <- structure(list(subject = structure(1:6, .Label >c("001-002", >"002-003", "003-004", "004-005", "005-006", "006-007"), class >"factor"), > group = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("boys", > "girls"), class = "factor"), wk1 = c(2L, 7L, 9L, 5L, 2L, > 1L), wk2 = c(3L, 6L, 4L, 7L, 6L, 4L), wk3 = c(4L, 5L, 6L, > 8L, 3L, 7L), wk4 = c(5L, 4L, 1L, 9L, 8L, 4L)), .Names = c("subject", >"group", "wk1", "wk2", "wk3", "wk4"), class = "data.frame", row.names >c(NA, >-6L)) > >testdata$subject <- as.factor(substring(as.character(testdata$subject), >1, 3)) > >> testdata > subject group wk1 wk2 wk3 wk4 >1 001 boys 2 3 4 5 >2 002 boys 7 6 5 4 >3 003 boys 9 4 6 1 >4 004 girls 5 7 8 9 >5 005 girls 2 6 3 8 >6 006 girls 1 4 7 4 >> str(testdata) >'data.frame': 6 obs. of 6 variables: > $ subject: Factor w/ 6 levels "001","002","003",..: 1 2 3 4 5 6 > $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 > $ wk1 : int 2 7 9 5 2 1 > $ wk2 : int 3 6 4 7 6 4 > $ wk3 : int 4 5 6 8 3 7 > $ wk4 : int 5 4 1 9 8 4 > >Sarah > >On Fri, Mar 4, 2016 at 1:00 PM, KMNanus <kmnanus at gmail.com> wrote: >> >> Here?s the dataset I?m working with, called test - >> >> subject group wk1 wk2 wk3 wk4 place >> 001-002 boys 2 3 4 5 >> 002-003 boys 7 6 5 4 >> 003-004 boys 9 4 6 1 >> 004-005 girls 5 7 8 9 >> 005-006 girls 2 6 3 8 >> 006-007 girls 1 4 7 4 >> >> >> if I call mutate(test, place = substr(subject,1,3), ?001 is the first >observation in the place column >> >> But it?s a character and ?subject? is a factor. I need place to be a >factor, too, but I need the observations to be ONLY the first three >numbers of ?subject.? >> >> Does that make my request more understandable? > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide >R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.[[alternative HTML version deleted]]
Here?s where I?m stumped - when I call mutate(test, place = substr(test$subject, 1,3)) to create a place variable, I get this, with place as a character variable. subject group wk1 wk2 wk3 wk4 place (fctr) (fctr) (int) (int) (int) (int) (chr) 1 001-002 boys 2 3 4 5 001 2 002-003 boys 7 6 5 4 002 3 003-004 boys 9 4 6 1 003 4 004-005 girls 5 7 8 9 004 5 005-006 girls 2 6 3 8 005 6 006-007 girls 1 4 7 4 006 When I call test$place <- factor(test$place), I receive the msg - "Error in `$<-.data.frame`(`*tmp*`, "place", value = integer(0)) : replacement has 0 rows, data has 6. If I call mutate this way - mutate(test, place = factor(substr(test$subject,1,3))), I get the same output as above but when I call class(test$place), I get NULL and the variable disappears. I can?t figure out why. Ken kmnanus at gmail.com 914-450-0816 (tel) 347-730-4813 (fax)> On Mar 4, 2016, at 3:46 PM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote: > > I much prefer the factor function over the as.factor function for converting character to factor, since you can set the levels in the order you want them to be. > -- > Sent from my phone. Please excuse my brevity. > > On March 4, 2016 10:07:27 AM PST, Sarah Goslee <sarah.goslee at gmail.com> wrote: > As everyone has been telling you, as.factor(). > If you like the mutate approach, you can call as.factor(test$subject) > to convert it. > > Here's a one-liner with reproducible data. > > > testdata <- structure(list(subject = structure(1:6, .Label = c("001-002", > "002-003", "003-004", "004-005", "005-006", "006-007"), class = "factor"), > group = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("boys", > "girls"), class = "factor"), wk1 = c(2L, 7L, 9L, 5L, 2L, > 1L), wk2 = c(3L, 6L, 4L, 7L, 6L, 4L), wk3 = c(4L, 5L, 6L, > 8L, 3L, 7L), wk4 = c(5L, 4L, 1L, 9L, 8L, 4L)), .Names = c("subject", > "group", "wk1", "wk2", "wk3", "wk4"), class = "data.frame", row.names = c(NA, > -6L)) > > testdata$subject <- as.factor(substring(as.character(testdata$subject), 1, 3)) > > > testdata > subject group wk1 wk2 wk3 wk4 > 1 001 boys 2 3 4 5 > 2 002 boys 7 6 5 4 > 3 003 boys 9 4 6 1 > 4 004 girls 5 7 8 9 > 5 005 girls 2 6 3 8 > 6 006 girls 1 4 7 4 > str(testdata) > 'data.frame': 6 obs. of 6 variables: > $ subject: Factor w/ 6 levels "001","002","003",..: 1 2 3 4 5 6 > $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 > $ wk1 : int 2 7 9 5 2 1 > $ wk2 : int 3 6 4 7 6 4 > $ wk3 : int 4 5 6 8 3 7 > $ wk4 : int 5 4 1 9 8 4 > > Sarah > > On Fri, Mar 4, 2016 at 1:00 PM, KMNanus <kmnanus at gmail.com> wrote: > > Here?s the dataset > I?m working with, called test - > > subject group wk1 wk2 wk3 wk4 place > 001-002 boys 2 3 4 5 > 002-003 boys 7 6 5 4 > 003-004 boys 9 4 6 1 > 004-005 girls 5 7 8 9 > 005-006 girls 2 6 3 8 > 006-007 girls 1 4 7 4 > > > if I call mutate(test, place = substr(subject,1,3), ?001 is the first observation in the place column > > But it?s a character and ?subject? is a factor. I need place to be a factor, too, but I need the observations to be ONLY the first three numbers of ?subject.? > > Does that make my request more understandable? > > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > stat.ethz.ch/mailman/listinfo/r-help <stat.ethz.ch/mailman/listinfo/r-help> > PLEASE do read the posting guide R-project.org/posting-guide.html <r-project.org/posting-guide.html> > and provide commented, minimal, > self-contained, reproducible code.
You're not saving the result of mutate(). You're just printing it to the screen. Try instead: test <- mutate(testdata, place = substr(testdata$subject, 1,3)) test$place <- as.factor(test$place) # or factor() if you'd rather This is why we ask for reproducible examples with data and code. Look through the following and see if you understand. test <- structure(list(subject = structure(1:6, .Label = c("001-002", "002-003", "003-004", "004-005", "005-006", "006-007"), class = "factor"), group = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("boys", "girls"), class = "factor"), wk1 = c(2L, 7L, 9L, 5L, 2L, 1L), wk2 = c(3L, 6L, 4L, 7L, 6L, 4L), wk3 = c(4L, 5L, 6L, 8L, 3L, 7L), wk4 = c(5L, 4L, 1L, 9L, 8L, 4L)), .Names = c("subject", "group", "wk1", "wk2", "wk3", "wk4"), class = "data.frame", row.names = c(NA, -6L))> str(test)'data.frame': 6 obs. of 6 variables: $ subject: Factor w/ 6 levels "001-002","002-003",..: 1 2 3 4 5 6 $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 $ wk1 : int 2 7 9 5 2 1 $ wk2 : int 3 6 4 7 6 4 $ wk3 : int 4 5 6 8 3 7 $ wk4 : int 5 4 1 9 8 4> mutate(test, place = substr(testdata$subject, 1,3))subject group wk1 wk2 wk3 wk4 place 1 001-002 boys 2 3 4 5 001 2 002-003 boys 7 6 5 4 002 3 003-004 boys 9 4 6 1 003 4 004-005 girls 5 7 8 9 004 5 005-006 girls 2 6 3 8 005 6 006-007 girls 1 4 7 4 006> str(test)'data.frame': 6 obs. of 6 variables: $ subject: Factor w/ 6 levels "001-002","002-003",..: 1 2 3 4 5 6 $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 $ wk1 : int 2 7 9 5 2 1 $ wk2 : int 3 6 4 7 6 4 $ wk3 : int 4 5 6 8 3 7 $ wk4 : int 5 4 1 9 8 4 test <- mutate(testdata, place = substr(testdata$subject, 1,3)) test$place <- as.factor(test$place)> str(test)'data.frame': 6 obs. of 7 variables: $ subject: Factor w/ 6 levels "001-002","002-003",..: 1 2 3 4 5 6 $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 $ wk1 : int 2 7 9 5 2 1 $ wk2 : int 3 6 4 7 6 4 $ wk3 : int 4 5 6 8 3 7 $ wk4 : int 5 4 1 9 8 4 $ place : Factor w/ 6 levels "001","002","003",..: 1 2 3 4 5 6 On Fri, Mar 4, 2016 at 4:13 PM, KMNanus <kmnanus at gmail.com> wrote:> Here?s where I?m stumped - > > when I call mutate(test, place = substr(test$subject, 1,3)) to create a > place variable, I get this, with place as a character variable. > > subject group wk1 wk2 wk3 wk4 place > (fctr) (fctr) (int) (int) (int) (int) (chr) > 1 001-002 boys 2 3 4 5 001 > 2 002-003 boys 7 6 5 4 002 > 3 003-004 boys 9 4 6 1 003 > 4 004-005 girls 5 7 8 9 004 > 5 005-006 girls 2 6 3 8 005 > 6 006-007 girls 1 4 7 4 006 > > When I call test$place <- factor(test$place), I receive the msg - "Error in > `$<-.data.frame`(`*tmp*`, "place", value = integer(0)) : > replacement has 0 rows, data has 6. > > If I call mutate this way - mutate(test, place > factor(substr(test$subject,1,3))), I get the same output as above but when I > call class(test$place), I get NULL and the variable disappears. > > I can?t figure out why. > > Ken > kmnanus at gmail.com > 914-450-0816 (tel) > 347-730-4813 (fax) > > > On Mar 4, 2016, at 3:46 PM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote: > > I much prefer the factor function over the as.factor function for converting > character to factor, since you can set the levels in the order you want them > to be. > -- > Sent from my phone. Please excuse my brevity. > > On March 4, 2016 10:07:27 AM PST, Sarah Goslee <sarah.goslee at gmail.com> > wrote: >> >> As everyone has been telling you, as.factor(). >> If you like the mutate approach, you can call as.factor(test$subject) >> to convert it. >> >> Here's a one-liner with reproducible data. >> >> >> testdata <- structure(list(subject = structure(1:6, .Label = c("001-002", >> "002-003", "003-004", "004-005", "005-006", "006-007"), class = "factor"), >> group = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("boys", >> "girls"), class = "factor"), wk1 = c(2L, 7L, 9L, 5L, 2L, >> 1L), wk2 = c(3L, 6L, 4L, 7L, 6L, 4L), wk3 = c(4L, 5L, 6L, >> 8L, 3L, 7L), wk4 = c(5L, 4L, 1L, 9L, 8L, 4L)), .Names = c("subject", >> "group", "wk1", "wk2", "wk3", "wk4"), class = "data.frame", row.names >> c(NA, >> -6L)) >> >> testdata$subject <- as.factor(substring(as.character(testdata$subject), 1, >> 3)) >> >>> >>> testdata >> >> subject group wk1 wk2 wk3 wk4 >> 1 001 boys 2 3 4 5 >> 2 002 boys 7 6 5 4 >> 3 003 boys 9 4 6 1 >> 4 004 girls 5 7 8 9 >> 5 005 girls 2 6 3 8 >> 6 006 girls 1 4 7 4 >>> >>> str(testdata) >> >> 'data.frame': 6 obs. of 6 variables: >> $ subject: Factor w/ 6 levels "001","002","003",..: 1 2 3 4 5 6 >> $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 >> $ wk1 : int 2 7 9 5 2 1 >> $ wk2 : int 3 6 4 7 6 4 >> $ wk3 : int 4 5 6 8 3 7 >> $ wk4 : int 5 4 1 9 8 4 >> >> Sarah >> >> On Fri, Mar 4, 2016 at 1:00 PM, KMNanus <kmnanus at gmail.com> wrote: >>> >>> >>> Here?s the dataset >>> I?m working with, called test - >>> >>> subject group wk1 wk2 wk3 wk4 place >>> 001-002 boys 2 3 4 5 >>> 002-003 boys 7 6 5 4 >>> 003-004 boys 9 4 6 1 >>> 004-005 girls 5 7 8 9 >>> 005-006 girls 2 6 3 8 >>> 006-007 girls 1 4 7 4 >>> >>> >>> if I call mutate(test, place = substr(subject,1,3), ?001 is the first >>> observation in the place column >>> >>> But it?s a character and ?subject? is a factor. I need place to be a >>> factor, too, but I need the observations to be ONLY the first three numbers >>> of ?subject.? >>> >>> Does that make my request more understandable? >>
This is not a problem with factor or as.factor, this is a problem with your use of the dplyr package or with bugs in that package. Please make a reproducible example, making sure to use the dput function to create the code that initializes the data so we can run your code. Read the Posting Guide for more on reproducibility. To avoid getting your code messed up in transit to us, make sure you send your email in plain text mode... this is also mentioned in the PG. -- Sent from my phone. Please excuse my brevity. On March 4, 2016 1:13:54 PM PST, KMNanus <kmnanus at gmail.com> wrote:>Here?s where I?m stumped - > >when I call mutate(test, place = substr(test$subject, 1,3)) to create a >place variable, I get this, with place as a character variable. > > subject group wk1 wk2 wk3 wk4 place > (fctr) (fctr) (int) (int) (int) (int) (chr) >1 001-002 boys 2 3 4 5 001 >2 002-003 boys 7 6 5 4 002 >3 003-004 boys 9 4 6 1 003 >4 004-005 girls 5 7 8 9 004 >5 005-006 girls 2 6 3 8 005 >6 006-007 girls 1 4 7 4 006 > >When I call test$place <- factor(test$place), I receive the msg - >"Error in `$<-.data.frame`(`*tmp*`, "place", value = integer(0)) : > replacement has 0 rows, data has 6. > >If I call mutate this way - mutate(test, place >factor(substr(test$subject,1,3))), I get the same output as above but >when I call class(test$place), I get NULL and the variable disappears. > >I can?t figure out why. > >Ken >kmnanus at gmail.com >914-450-0816 (tel) >347-730-4813 (fax) > > > >> On Mar 4, 2016, at 3:46 PM, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> >wrote: >> >> I much prefer the factor function over the as.factor function for >converting character to factor, since you can set the levels in the >order you want them to be. >> -- >> Sent from my phone. Please excuse my brevity. >> >> On March 4, 2016 10:07:27 AM PST, Sarah Goslee ><sarah.goslee at gmail.com> wrote: >> As everyone has been telling you, as.factor(). >> If you like the mutate approach, you can call as.factor(test$subject) >> to convert it. >> >> Here's a one-liner with reproducible data. >> >> >> testdata <- structure(list(subject = structure(1:6, .Label >c("001-002", >> "002-003", "003-004", "004-005", "005-006", "006-007"), class >"factor"), >> group = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("boys", >> "girls"), class = "factor"), wk1 = c(2L, 7L, 9L, 5L, 2L, >> 1L), wk2 = c(3L, 6L, 4L, 7L, 6L, 4L), wk3 = c(4L, 5L, 6L, >> 8L, 3L, 7L), wk4 = c(5L, 4L, 1L, 9L, 8L, 4L)), .Names >c("subject", >> "group", "wk1", "wk2", "wk3", "wk4"), class = "data.frame", row.names >= c(NA, >> -6L)) >> >> testdata$subject <- >as.factor(substring(as.character(testdata$subject), 1, 3)) >> >> >> testdata >> subject group wk1 wk2 wk3 wk4 >> 1 001 boys 2 3 4 5 >> 2 002 boys 7 6 5 4 >> 3 003 boys 9 4 6 1 >> 4 004 girls 5 7 8 9 >> 5 005 girls 2 6 3 8 >> 6 006 girls 1 4 7 4 >> str(testdata) >> 'data.frame': 6 obs. of 6 variables: >> $ subject: Factor w/ 6 levels "001","002","003",..: 1 2 3 4 5 6 >> $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 >> $ wk1 : int 2 7 9 5 2 1 >> $ wk2 : int 3 6 4 7 6 4 >> $ wk3 : int 4 5 6 8 3 7 >> $ wk4 : int 5 4 1 9 8 4 >> >> Sarah >> >> On Fri, Mar 4, 2016 at 1:00 PM, KMNanus <kmnanus at gmail.com> wrote: >> >> Here?s the dataset >> I?m working with, called test - >> >> subject group wk1 wk2 wk3 wk4 place >> 001-002 boys 2 3 4 5 >> 002-003 boys 7 6 5 4 >> 003-004 boys 9 4 6 1 >> 004-005 girls 5 7 8 9 >> 005-006 girls 2 6 3 8 >> 006-007 girls 1 4 7 4 >> >> >> if I call mutate(test, place = substr(subject,1,3), ?001 is the >first observation in the place column >> >> But it?s a character and ?subject? is a factor. I need place to be >a factor, too, but I need the observations to be ONLY the first three >numbers of ?subject.? >> >> Does that make my request more understandable? >> >> >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> stat.ethz.ch/mailman/listinfo/r-help ><stat.ethz.ch/mailman/listinfo/r-help> >> PLEASE do read the posting guide >R-project.org/posting-guide.html ><r-project.org/posting-guide.html> >> and provide commented, minimal, >> self-contained, reproducible code.[[alternative HTML version deleted]]
LOL you still need to assign it though: test <- mutate(test, place = factor(substr(test$subject,1,3))) str(test) 'data.frame': 6 obs. of 7 variables: $ subject: Factor w/ 6 levels "001-002","002-003",..: 1 2 3 4 5 6 $ group : Factor w/ 2 levels "boys","girls": 1 1 1 2 2 2 $ wk1 : int 2 7 9 5 2 1 $ wk2 : int 3 6 4 7 6 4 $ wk3 : int 4 5 6 8 3 7 $ wk4 : int 5 4 1 9 8 4 $ place : Factor w/ 6 levels "001","002","003",..: 1 2 3 4 5 6 Without assigning the result, the output only gets printed to console. Remember that R is a functional language - a properly written R functio does not change anything, it only returns its result. :-) On Mar 4, 2016, at 4:13 PM, KMNanus <kmnanus at gmail.com> wrote:> If I call mutate this way - mutate(test, place = factor(substr(test$subject,1,3))), I get the same output as above but when I call class(test$place), I get NULL and the variable disappears.