86

dplyr::select results in a data.frame, is there a way to make it return a vector if the result is one column?

Currently, I have to do extra step (res <- res$y) to convert it to vector from data.frame, see this example:

#dummy data
df <- data.frame(x = 1:10, y = LETTERS[1:10], stringsAsFactors = FALSE)

#dplyr filter and select results in data.frame
res <- df %>% filter(x > 5) %>% select(y)
class(res)
#[1] "data.frame"

#desired result is a character vector
res <- res$y
class(res)
#[1] "character"

Something as below:

res <- df %>% filter(x > 5) %>% select(y) %>% as.character
res
# This gives strange output
[1] "c(\"F\", \"G\", \"H\", \"I\", \"J\")"

# I need:
# [1] "F" "G" "H" "I" "J"
zx8754
  • 52,746
  • 12
  • 114
  • 209
  • 1
    @Henrik Yes, you are right. I saw that post, somehow couldn't replicate, hence this post. Now it works! `df %>% filter(x>5) %>% select(y) %>% .[["y"]]`. – zx8754 Nov 26 '14 at 13:22
  • 3
    This is not a duplicate. The other question is specific to table with database back-ends, where the answer to this question (`%>% .$y`) does not work. – nacnudus Sep 16 '15 at 21:17

3 Answers3

148

The best way to do it (IMO):

library(dplyr)
df <- data_frame(x = 1:10, y = LETTERS[1:10])

df %>% 
  filter(x > 5) %>% 
  .$y

In dplyr 0.7.0, you can now use pull():

df %>% filter(x > 5) %>% pull(y)
zx8754
  • 52,746
  • 12
  • 114
  • 209
hadley
  • 102,019
  • 32
  • 183
  • 245
9

Something like this?

> res <- df %>% filter(x>5) %>% select(y) %>% sapply(as.character) %>% as.vector
> res
[1] "F" "G" "H" "I" "J"
> class(res)
[1] "character"
LyzandeR
  • 37,047
  • 12
  • 77
  • 87
6

You could also try

res <- df %>%
           filter(x>5) %>%
           select(y) %>%
           as.matrix() %>%
           c()
#[1] "F" "G" "H" "I" "J"

 class(res)
#[1] "character"
akrun
  • 874,273
  • 37
  • 540
  • 662