Dear All, I have an observation / question about how the function length() works once package dplyr is loaded. Say we have a data.frame df with n rows and m columns. Then a way to get the number of rows is to use length(df$m1) (m1 here stand is as the header of the first column) or, alternatively length(df[,1]). Both commands will return n. However, once dplyr is loaded, length(df[,1]) will return a value of 1. length(df$m1) and also length(df[[1]]) will correctly return n. I know that using length() may not be the most elegant or efficient way to get the value of n. However, what puzzles (and somewhat disturbs) me is that loading of dplyr affects how length() works, without there being a warning or masking message upon loading it. Any clarification or comment would be welcome. Thank you so much, Karl -- Karl Schilling
On 04 Aug 2015, at 10:50 , Karl Schilling <karl.schilling at uni-bonn.de> wrote:> Dear All, > > I have an observation / question about how the function length() works once package dplyr is loaded. > > Say we have a data.frame df with n rows and m columns. Then a way to get the number of rows is to use > > length(df$m1) (m1 here stand is as the header of the first column) > > or, alternatively > > length(df[,1]). > > Both commands will return n. > > However, once dplyr is loaded, > > length(df[,1]) will return a value of 1. > > length(df$m1) and also length(df[[1]]) will correctly return n. > > I know that using length() may not be the most elegant or efficient way to get the value of n. However, what puzzles (and somewhat disturbs) me is that loading of dplyr affects how length() works, without there being a warning or masking message upon loading it. > > Any clarification or comment would be welcome.Presumably, dplyr changes how [.data.frame works (by altering the default for drop=, I expect) so that df[,1] is a data frame with 1 variable and not a vector. And yes, that _is_ somewhat disturbing. -pd> > Thank you so much, > > Karl > > > -- > Karl Schilling > > ______________________________________________ > 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.-- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Office: A 4.23 Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
I can confirm that the drop default is different, but keep in mind that it is only changed for a tbl_df so just convert back to data.frame at the end of your dplr operations to get back to your familiar data.frame behavior. --------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k --------------------------------------------------------------------------- Sent from my phone. Please excuse my brevity. On August 4, 2015 5:06:44 AM EDT, peter dalgaard <pdalgd at gmail.com> wrote:> >On 04 Aug 2015, at 10:50 , Karl Schilling <karl.schilling at uni-bonn.de> >wrote: > >> Dear All, >> >> I have an observation / question about how the function length() >works once package dplyr is loaded. >> >> Say we have a data.frame df with n rows and m columns. Then a way to >get the number of rows is to use >> >> length(df$m1) (m1 here stand is as the header of the first column) >> >> or, alternatively >> >> length(df[,1]). >> >> Both commands will return n. >> >> However, once dplyr is loaded, >> >> length(df[,1]) will return a value of 1. >> >> length(df$m1) and also length(df[[1]]) will correctly return n. >> >> I know that using length() may not be the most elegant or efficient >way to get the value of n. However, what puzzles (and somewhat >disturbs) me is that loading of dplyr affects how length() works, >without there being a warning or masking message upon loading it. >> >> Any clarification or comment would be welcome. > >Presumably, dplyr changes how [.data.frame works (by altering the >default for drop=, I expect) so that df[,1] is a data frame with 1 >variable and not a vector. And yes, that _is_ somewhat disturbing. > >-pd > >> >> Thank you so much, >> >> Karl >> >> >> -- >> Karl Schilling >> >> ______________________________________________ >> 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.
>> length(df[,1]). >> >> Both commands will return n. >> >> However, once dplyr is loaded, >> >> length(df[,1]) will return a value of 1. >> >> length(df$m1) and also length(df[[1]]) will correctly return n. >> >> I know that using length() may not be the most elegant or efficient way to get the value of n. However, what puzzles (and somewhat disturbs) me is that loading of dplyr affects how length() works, without there being a warning or masking message upon loading it. >> >> Any clarification or comment would be welcome. > > Presumably, dplyr changes how [.data.frame works (by altering the default for drop=, I expect) so that df[,1] is a data frame with 1 variable and not a vector. And yes, that _is_ somewhat disturbing.It changes the behaviour for [.tbl_df (tbl_df is a very minor extension of data frame with custom [ and print methods). This is partly an experiment to see what happens when you make [ more consistent - [.tbl_df always returns a data frame, so if you want a vector you have to use [[. Hadley -- http://had.co.nz/