identifying variable class with subsetting

Hi, and welcome!

Even with the vignette, a reproducible example, called a reprex always attracts more (and sometimes better) answers. Here, the red herring is the diamond vignette, which isn't in the package.

@andresrcs put his finger exactly on the problem, nevertheless.

For the benefit of others who may come to this thread from a more basic level, the best place to start with this type of problem is to examine the structure of the object

str(d0)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	53940 obs. of  10 variables:
 $ carat  : num  0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
 $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
 $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
 $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
 $ depth  : num  61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
 $ table  : num  55 61 65 58 58 57 57 55 61 61 ...
 $ price  : int  326 326 327 334 335 336 336 337 337 338 ...
 $ x      : num  3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
 $ y      : num  3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
 $ z      : num  2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...

As you noted, d0$x is clearly numeric, which can be confirmed simply with

is.numeric(d0$x)
[1] TRUE

The $ operator to examine a column in the data frame is simple and not much prone to error; it provides a clear look at the object.

class(d0$x)
[1] "numeric"

Compare this with

 class(d0)
[1] "tbl_df"     "tbl"        "data.frame"

The next question: what is d0[, "x"]?

d0[,"x"]
# A tibble: 53,940 x 1
       x
   <dbl>
 1  3.95
 2  3.89
 3  4.05
 4  4.2 
 5  4.34
 6  3.94
 7  3.95
 8  4.07
 9  3.87
10  4   
# … with 53,930 more rows

which is, of course, of class tibble, not numeric.

Square brackets, for subsetting, return portions of data frames. Before applying a function to a subset, it pays to apply str() to confirm that the subset is an appropriate argument.

1 Like