Hi R-Helpers, Sorry to bother you, but I have a simple task that I can't figure out how to do. For example, I have some names in two columns NamesWide<-data.frame(Name1=c("Tom","Dick"),Name2=c("Larry","Curly")) and I simply want to get a single column NamesLong<-data.frame(Names=c("Tom","Dick","Larry","Curly"))> NamesLongNames 1 Tom 2 Dick 3 Larry 4 Curly Stack produces an error NamesLong<-stack(NamesWide$Name1,NamesWide$Names2) Error in if (drop) { : argument is of length zero So does bind_rows> NamesLong<-dplyr::bind_rows(NamesWide$Name1,NamesWide$Name2)Error in `dplyr::bind_rows()`: ! Argument 1 must be a data frame or a named atomic vector. Run `rlang::last_error()` to see where the error occurred. I tried making separate dataframes to get around the error in bind_rows but it puts the data in two different columns Name1<-data.frame(c("Tom","Dick")) Name2<-data.frame(c("Larry","Curly")) NamesLong<-dplyr::bind_rows(Name1,Name2)> NamesLongc..Tom....Dick.. c..Larry....Curly.. 1 Tom <NA> 2 Dick <NA> 3 <NA> Larry 4 <NA> Curly gather makes no change to the data NamesLong<-gather(NamesWide,Name1,Name2)> NamesLongName1 Name2 1 Tom Larry 2 Dick Curly Please help me solve what should be a very simple problem. Thanks, John Sparks [[alternative HTML version deleted]]
pivot_longer() Sent from my iPhone> On 3 Apr 2023, at 18:09, Sparks, John <jspark4 at uic.edu> wrote: > > ?Hi R-Helpers, > > Sorry to bother you, but I have a simple task that I can't figure out how to do. > > For example, I have some names in two columns > > NamesWide<-data.frame(Name1=c("Tom","Dick"),Name2=c("Larry","Curly")) > > and I simply want to get a single column > NamesLong<-data.frame(Names=c("Tom","Dick","Larry","Curly")) >> NamesLong > Names > 1 Tom > 2 Dick > 3 Larry > 4 Curly > > > Stack produces an error > NamesLong<-stack(NamesWide$Name1,NamesWide$Names2) > Error in if (drop) { : argument is of length zero > > So does bind_rows >> NamesLong<-dplyr::bind_rows(NamesWide$Name1,NamesWide$Name2) > Error in `dplyr::bind_rows()`: > ! Argument 1 must be a data frame or a named atomic vector. > Run `rlang::last_error()` to see where the error occurred. > > I tried making separate dataframes to get around the error in bind_rows but it puts the data in two different columns > Name1<-data.frame(c("Tom","Dick")) > Name2<-data.frame(c("Larry","Curly")) > NamesLong<-dplyr::bind_rows(Name1,Name2) >> NamesLong > c..Tom....Dick.. c..Larry....Curly.. > 1 Tom <NA> > 2 Dick <NA> > 3 <NA> Larry > 4 <NA> Curly > > gather makes no change to the data > NamesLong<-gather(NamesWide,Name1,Name2) >> NamesLong > Name1 Name2 > 1 Tom Larry > 2 Dick Curly > > > Please help me solve what should be a very simple problem. > > Thanks, > John Sparks > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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.
Hi, You were on the right track using stack(), but you just pass the entire data frame as a single object, not the separate columns:> stack(NamesWide)? values ? ind 1 ? ?Tom Name1 2 ? Dick Name1 3 ?Larry Name2 4 ?Curly Name2 Note that stack also returns the index (second column of 'ind' values), which tells you which column in the source data frame the stacked values originated from. Thus, if you just want the actual data:> stack(NamesWide)$values[1] "Tom" ? "Dick" ?"Larry" "Curly" returns a vector, or:> stack(NamesWide)[, 1, drop = FALSE]? values 1 ? ?Tom 2 ? Dick 3 ?Larry 4 ?Curly which returns a data frame with a single column named 'values'. Regards, Marc Schwartz On April 3, 2023 at 11:08:59 AM, Sparks, John (jspark4 at uic.edu (mailto:jspark4 at uic.edu)) wrote:> Hi R-Helpers, > > Sorry to bother you, but I have a simple task that I can't figure out how to do. > > For example, I have some names in two columns > > NamesWide<-data.frame(Name1=c("Tom","Dick"),Name2=c("Larry","Curly")) > > and I simply want to get a single column > NamesLong<-data.frame(Names=c("Tom","Dick","Larry","Curly")) > > NamesLong > Names > 1 Tom > 2 Dick > 3 Larry > 4 Curly > > > Stack produces an error > NamesLong<-stack(NamesWide$Name1,NamesWide$Names2) > Error in if (drop) { : argument is of length zero > > So does bind_rows > > NamesLong<-dplyr::bind_rows(NamesWide$Name1,NamesWide$Name2) > Error in `dplyr::bind_rows()`: > ! Argument 1 must be a data frame or a named atomic vector. > Run `rlang::last_error()` to see where the error occurred. > > I tried making separate dataframes to get around the error in bind_rows but it puts the data in two different columns > Name1<-data.frame(c("Tom","Dick")) > Name2<-data.frame(c("Larry","Curly")) > NamesLong<-dplyr::bind_rows(Name1,Name2) > > NamesLong > c..Tom....Dick.. c..Larry....Curly.. > 1 Tom > 2 Dick > 3 Larry > 4 Curly > > gather makes no change to the data > NamesLong<-gather(NamesWide,Name1,Name2) > > NamesLong > Name1 Name2 > 1 Tom Larry > 2 Dick Curly > > > Please help me solve what should be a very simple problem. > > Thanks, > John Sparks > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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.
unname(unlist(NamesWide)) On April 3, 2023 8:08:59 AM PDT, "Sparks, John" <jspark4 at uic.edu> wrote:>Hi R-Helpers, > >Sorry to bother you, but I have a simple task that I can't figure out how to do. > >For example, I have some names in two columns > >NamesWide<-data.frame(Name1=c("Tom","Dick"),Name2=c("Larry","Curly")) > >and I simply want to get a single column >NamesLong<-data.frame(Names=c("Tom","Dick","Larry","Curly")) >> NamesLong > Names >1 Tom >2 Dick >3 Larry >4 Curly > > >Stack produces an error >NamesLong<-stack(NamesWide$Name1,NamesWide$Names2) >Error in if (drop) { : argument is of length zero > >So does bind_rows >> NamesLong<-dplyr::bind_rows(NamesWide$Name1,NamesWide$Name2) >Error in `dplyr::bind_rows()`: >! Argument 1 must be a data frame or a named atomic vector. >Run `rlang::last_error()` to see where the error occurred. > >I tried making separate dataframes to get around the error in bind_rows but it puts the data in two different columns >Name1<-data.frame(c("Tom","Dick")) >Name2<-data.frame(c("Larry","Curly")) >NamesLong<-dplyr::bind_rows(Name1,Name2) >> NamesLong > c..Tom....Dick.. c..Larry....Curly.. >1 Tom <NA> >2 Dick <NA> >3 <NA> Larry >4 <NA> Curly > >gather makes no change to the data >NamesLong<-gather(NamesWide,Name1,Name2) >> NamesLong > Name1 Name2 >1 Tom Larry >2 Dick Curly > > >Please help me solve what should be a very simple problem. > >Thanks, >John Sparks > > > > > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at 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.-- Sent from my phone. Please excuse my brevity.
Just to repeat: you have NamesWide<-data.frame(Name1=c("Tom","Dick"),Name2=c("Larry","Curly")) and you want NamesLong<-data.frame(Names=c("Tom","Dick","Larry","Curly")) There must be something I am missing, because NamesLong <- data.frame(Names = c(NamesWide$Name1, NamesWide$Name2)) appears to do the job in the simplest possible manner. There are all sorts of alternatives, such as data.frame(Name = as.vector(as.matrix(NamesWide[, 1:2]))) As for stack(), the main problem there was a typo (Names2 for Name2).> stack(NamesWide)values ind 1 Tom Name1 2 Dick Name1 3 Larry Name2 4 Curly Name2 If there were multiple columns, you might do> stack(NamesWide[,c("Name1","Name2")])$values[1] "Tom" "Dick" "Larry" "Curly" On Tue, 4 Apr 2023 at 03:09, Sparks, John <jspark4 at uic.edu> wrote:> Hi R-Helpers, > > Sorry to bother you, but I have a simple task that I can't figure out how > to do. > > For example, I have some names in two columns > > NamesWide<-data.frame(Name1=c("Tom","Dick"),Name2=c("Larry","Curly")) > > and I simply want to get a single column > NamesLong<-data.frame(Names=c("Tom","Dick","Larry","Curly")) > > NamesLong > Names > 1 Tom > 2 Dick > 3 Larry > 4 Curly > > > Stack produces an error > NamesLong<-stack(NamesWide$Name1,NamesWide$Names2) > Error in if (drop) { : argument is of length zero > > So does bind_rows > > NamesLong<-dplyr::bind_rows(NamesWide$Name1,NamesWide$Name2) > Error in `dplyr::bind_rows()`: > ! Argument 1 must be a data frame or a named atomic vector. > Run `rlang::last_error()` to see where the error occurred. > > I tried making separate dataframes to get around the error in bind_rows > but it puts the data in two different columns > Name1<-data.frame(c("Tom","Dick")) > Name2<-data.frame(c("Larry","Curly")) > NamesLong<-dplyr::bind_rows(Name1,Name2) > > NamesLong > c..Tom....Dick.. c..Larry....Curly.. > 1 Tom <NA> > 2 Dick <NA> > 3 <NA> Larry > 4 <NA> Curly > > gather makes no change to the data > NamesLong<-gather(NamesWide,Name1,Name2) > > NamesLong > Name1 Name2 > 1 Tom Larry > 2 Dick Curly > > > Please help me solve what should be a very simple problem. > > Thanks, > John Sparks > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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]]