2014-11-26 14 views
35

dplyr::select kończy na data.frame, czy istnieje sposób na zwrócenie wektora, jeśli wynik to jedna kolumna?dplyr :: wybierz jedną kolumnę, a wynik jako wektor

Obecnie mam zrobić dodatkowy krok (res <- res$y), aby przekształcić go do wektora z data.frame patrz poniższy przykład:

#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" 

Coś jak poniżej:

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" 
+1

@Henrik Tak, masz rację. Widziałem, że post, w jakiś sposób nie może się powielać, stąd ten post. Teraz działa! 'df%>% filtra (x> 5)%>% wybierz (y)%>%. [[" y "]]'. – zx8754

+3

OK! Ogólnie rzecz biorąc, dobrze jest odnieść się do takiego postu w swoim pytaniu, pokazać, co próbujesz i wyjaśnić, co poszło nie tak. To ratuje nas od powtarzania oczywistych odpowiedzi i wskazywania na posty, które już przeczytałeś i wypróbowałeś. Twoje zdrowie. – Henrik

+1

To nie jest duplikat. Drugie pytanie dotyczy tabeli z back-endami baz danych, gdzie odpowiedź na to pytanie ('%>%. $ Y') nie działa. – nacnudus

Odpowiedz

70

Najlepszym sposobem, aby to zrobić (IMO):

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

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

W dplyr 0.7.0, można teraz używać pull ():

df %>% filter(x > 5) %>% pull(y) 
+5

Czy możesz wskazać dokumentację operatora kropki w tym kontekście? – Andy

+1

@Andy see the magrittr docs – hadley

+10

W dplyr 0.7.0, możesz teraz użyć 'pull()': 'df%>% filter (x> 5)%>% pull (y)' – ianmcook

5

Coś takiego ?

> res <- df %>% filter(x>5) %>% select(y) %>% sapply(as.character) %>% as.vector 
> res 
[1] "F" "G" "H" "I" "J" 
> class(res) 
[1] "character" 
2

Można również spróbować

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

class(res) 
#[1] "character"