Skip to content

Getting subsets of a data frame

4 messages · Liaw, Andy, Brian Ripley, Fernando Saldanha

#
Because a data frame can hold different data types (even matrices) in
different variables, one row of it can not be converted to a vector in
general (where all elements need to be of the same type).

Andy
#
Perhaps Fernando will also note that is documented in ?"[.data.frame",
a slightly more appropriate reference than Bill's.

It would be a good idea to read a good account of R's indexing: Bill 
Venables and I know of a couple you will find in the R FAQ.
On Sat, 16 Apr 2005, Liaw, Andy wrote:

            

  
    
#
On Sat, 16 Apr 2005, Prof Brian Ripley wrote:

            
BTW,

sw <- swiss
sw[1,,drop=TRUE] *is* a list (not as claimed, but as documented)
sw[1, ]          is a data frame
sw[, 1]          is a numeric vector.

I should have pointed out that "[.data.frame" is in the See Also of Bill's 
reference.

BTW to Andy: a list is a vector, and Kurt and I recently have been trying 
to correct documentation that means `atomic vector' when it says `vector'.
(Long ago lists in R were pairlists and not vectors.)
[1] TRUE

  
    
#
I am reading as fast as I can! Just started with R five days ago.

I found the following in the documentation:

"Although the default for 'drop' is 'TRUE', the default behaviour when
only one _row_ is left is equivalent to specifying 'drop = FALSE'.  To
drop from a data frame to a list, 'drop = FALSE' has to (sic)
specified explicitly."

I think the exception mentioned in the first sentence is the reason
for my confusion.

I also think the second sentence is wrong and should have 'TRUE'
instead of 'FALSE'.

While it is true that a data frame is a list, it is not a list of
numbers, but rather a list of columns, which, if I understand
correctly, can be either vectors or matrices. So regardless of the
value assigned to 'drop' the returned object is a list.

When I asked "why isn't sw[1, ] a list?" I should have asked instead
"why isn't sw[1, ] a list of vectors?"

I did some experiments with a data frame a, where the columns are
vectors (no matrix columns):
[1] TRUE
[1] TRUE                     (did not sop being a data frame)
[1] TRUE                     (but it is a list)
[1] FALSE                   (no longer a data frame)
[1] TRUE                     (but it is a list)
[1] TRUE                    (still a data frame)
[1] TRUE                    (but it is a list)

I also tried:
$dates.num
[1] 477032400
dates.num
3 477032400  (notice the row name)
$names
[1] "dates.num"

$class
[1] "data.frame"

$row.names
[1] "3"
$names
[1] "dates.num"

FS
On 4/16/05, Prof Brian Ripley <ripley at stats.ox.ac.uk> wrote: