Help with filter and select function


#1

I am new to R and trying to filter out data on my metadata however whenever I try to filter or select anything, I get the same error.

Error in UseMethod("select_") :
no applicable method for 'select_' applied to an object of class "c('matrix', 'character')"

I have tried it with different columns and I get the same error. What does this mean and what can I do to fix this?


#2

Hi, and welcome to community.rstudio.com! Without knowing what your data and code look like, it's a little hard to answer your question. To help you get the right help for your question, can you please turn it into a reprex (reproducible example)? This will ensure we're all looking at the same data and code. A guide for creating a reprex can be found here.

From a high level, filter() and select() are different verbs in the tidyverse. filter() operates on rows, whereas select() operates on columns.

For example, in the reprex below, I'm using the built-in mtcars dataset to illustrate using filter() to retain certain rows by a certain criterion of interest, or using select() to retain certain columns based on column names.

library(tidyverse)

str(mtcars)
#> 'data.frame':    32 obs. of  11 variables:
#>  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
#>  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
#>  $ disp: num  160 160 108 258 360 ...
#>  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
#>  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
#>  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
#>  $ qsec: num  16.5 17 18.6 19.4 17 ...
#>  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
#>  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
#>  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
#>  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

# Filtering for cars with 6 cylinders

cars_6cyl <- mtcars %>% filter(cyl == 6) %>% head()
cars_6cyl
#>    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> 2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> 3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> 4 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> 5 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> 6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4

# Subsetting to a few columns of interest (mpg, cyl, and disp)

cars_subset <- mtcars %>% select(mpg, cyl, disp) %>% head()
cars_subset
#>                    mpg cyl disp
#> Mazda RX4         21.0   6  160
#> Mazda RX4 Wag     21.0   6  160
#> Datsun 710        22.8   4  108
#> Hornet 4 Drive    21.4   6  258
#> Hornet Sportabout 18.7   8  360
#> Valiant           18.1   6  225

Created on 2018-10-06 by the reprex package (v0.2.0).

I hope this helps! If not, can you please add a minimal reprex with your data and code?


#3

Based on both @kmprioli's example and the error you posted, I put together this reprex that I think identifies what is going on. Since everything in mtcars is numeric, converting just one column to character will mean that the entire matrix I create will be character as well. When I try and select a column from that matrix, I get the same error you do.

The way around this is to change how you are storing data. dplyr works on data frames and tibbles - you'll want to use one of those formats for storing your data as opposed to a matrix.

# load required package
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

# load data
mt_cars <- mtcars

# convert one variable in mtcars to character
mt_cars$mpg <- as.character(mt_cars$mpg)

# store the mtcars data as a matrix
mt_matrix <- as.matrix(mt_cars)

# try and use select
mt_mpg <- select(mt_matrix, mpg)
#> Error in UseMethod("select_"): no applicable method for 'select_' applied to an object of class "c('matrix', 'character')"

Created on 2018-10-06 by the reprex package (v0.2.1)


#4

It is a bit surprising to hear, but most error messages mean very little on their own β€” context is everything! That said, one thought: this message makes it sound like you tried to use select() (from the dplyr package) on a matrix of character data rather than on a data frame. All of the main functions in dplyr operate on data frames, not matrices. While both data frames and matrices can seem table-like, to R they are very different things.

It’s hard to go much further than that without seeing your code, so I encourage you to take @kmprioli’s excellent advice and try to make a reproducible example of your problem.


#5

There's another possibility, although it's hard to tell without a reprex: filter and select could be masked by another package. Whenever I have errors I can't work out with those two, I check my packages immediately :stuck_out_tongue: