2011-08-15 16 views
93

Mam dataframe takich jak:Przyjazny dla Rp sposób konwersji kolumna R data.frame do wektora?

a1 = c(1, 2, 3, 4, 5) 
a2 = c(6, 7, 8, 9, 10) 
a3 = c(11, 12, 13, 14, 15) 
aframe = data.frame(a1, a2, a3) 

Próbowałem następujących przekonwertować jednej z kolumn do wektora, ale to nie działa:

avector <- as.vector(aframe['a2']) 
class(avector) 
[1] "data.frame" 

Jest to jedyne rozwiązanie ja mógł wymyślić, ale jestem zakładając, że musi być lepszy sposób to zrobić:

class(aframe['a2']) 
[1] "data.frame" 
avector = c() 
for(atmp in aframe['a2']) { avector <- atmp } 
class(avector) 
[1] "numeric" 

Uwaga: Moje vocabular y powyżej może być wyłączony, więc proszę mnie poprawić, jeśli tak. Nadal uczę się świata R. Dodatkowo wszelkie wyjaśnienie tego, co się tu dzieje, jest doceniane (np. W odniesieniu do Pythona lub innego języka mogłoby pomóc!)

+5

Jak widać w odpowiedziach, ścisłe czytanie '? '[. Data.frame'' zabierze cię bardzo daleko. – joran

+0

@joran: Myślę, że to pierwszy raz, kiedy spotkałem się z tym konkretnym plikiem pomocy. Dzięki! Tuż przed moim planem migracji do data.table. :) – Iterator

Odpowiedz

137

Mam zamiar wyjaśnić to bez żadnych błędy, ale założę się, że będzie to przyciągać wyjaśnienie lub dwa w komentarzach.

Ramka danych jest listą. Po podzieleniu ramki danych przy użyciu nazwy kolumny i numeru [, otrzymujesz podukcję podrzędną (lub ramkę subdanych). Jeśli chcesz mieć rzeczywistą kolumnę atomową, możesz użyć [[ lub nieco myląco (dla mnie) możesz zrobić aframe[,2], który zwraca wektor, a nie podlistę.

Więc spróbuj uruchomić tę sekwencję i może wszystko będzie jaśniejsze:

avector <- as.vector(aframe['a2']) 
class(avector) 

avector <- aframe[['a2']] 
class(avector) 

avector <- aframe[,2] 
class(avector) 
+6

+1 Jest to przydatne. Przyzwyczaiłam się do używania 'aframe [," a2 "]' z powodu możliwości użycia tego z ramkami danych i macierzami i wydaje się, że uzyskuje takie same wyniki - wektor. – Iterator

+6

'[..., drop = F]' zawsze zwróci ramkę danych – hadley

+1

Jest to szczególnie dobrze wiedzieć, ponieważ składnia 'df $ x' zwraca wektor. Używałem tej składni przez długi czas, ale kiedy musiałem zacząć używać 'df ['name']' lub 'df [n]' do pobierania kolumn, natknąłem się na problemy kiedy próbowałem wysłać je do funkcji, które oczekiwały wektory. Użycie 'df [[n]]' lub 'df [['x']]' wyczyściło wszystko. – rensa

15

Nie trzeba as.vector(), ale trzeba poprawnego indeksowania: avector <- aframe[ , "a2"]

Jedna rzecz, aby mieć świadomość, drop=FALSE opcja [:

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15) 
R> aframe 
    a1 a2 a3 
1 1 6 11 
2 2 7 12 
3 3 8 13 
4 4 9 14 
5 5 10 15 
R> avector <- aframe[, "a2"] 
R> avector 
[1] 6 7 8 9 10 
R> avector <- aframe[, "a2", drop=FALSE] 
R> avector 
    a2 
1 6 
2 7 
3 8 
4 9 
5 10 
R> 
+4

+1: Przypomnienie o 'drop = FALSE' jest przydatne - pomaga mi to w przypadkach, w których mogę wybrać N kolumn z danych.frame, w przypadkach gdzie N = 1. – Iterator

+0

Używam tego, gdy nie mogę przewidzieć liczby kolumn wybranych iw przypadku pojawienia się jednej kolumny, wynik jest nadal przekazywany jako data.frame z n kolumnami. Wektor może rzucać kluczem małpy do funkcji w linii. –

23

można użyć $ extrac nia:

class(aframe$a1) 
[1] "numeric" 

lub podwójny nawias kwadratowy:

class(aframe[["a1"]]) 
[1] "numeric" 
4

Jeśli wystarczy użyć operatora wyciąg będzie pracować. Domyślnie [] ustawia opcję drop=TRUE, która jest tym, czego chcesz tutaj. Aby uzyskać więcej informacji, patrz ?'['.

> a1 = c(1, 2, 3, 4, 5) 
> a2 = c(6, 7, 8, 9, 10) 
> a3 = c(11, 12, 13, 14, 15) 
> aframe = data.frame(a1, a2, a3) 
> aframe[,'a2'] 
[1] 6 7 8 9 10 
> class(aframe[,'a2']) 
[1] "numeric" 
5

Kolejną zaletą korzystania z operatora [['jest to, że działa on zarówno z danymi .frame i data.table. Więc jeśli funkcja ma być wykonana działa zarówno data.frame i data.table i chcesz, aby wyodrębnić z niej kolumnę jako wektor następnie

data[["column_name"]] 

jest najlepszy.

2
a1 = c(1, 2, 3, 4, 5) 
a2 = c(6, 7, 8, 9, 10) 
a3 = c(11, 12, 13, 14, 15) 
aframe = data.frame(a1, a2, a3) 
avector <- as.vector(aframe['a2']) 

avector<-unlist(avector) 
#this will return a vector of type "integer" 
2

Istnieje prosty sposób na wykonanie tego zadania za pomocą dplyr.

dplyr::pull(aframe, a2) 
Powiązane problemy