Mam ramkę danych taką jak:
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 wykonać następujące czynności, aby przekonwertować jedną z kolumn na wektor, ale to nie działa:
avector <- as.vector(aframe['a2'])
class(avector)
[1] "data.frame"
To jedyne rozwiązanie, jakie mogłem wymyślić, ale zakładam, że musi być lepszy sposób na zrobienie tego:
class(aframe['a2'])
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"
Uwaga: moje słownictwo powyżej może być wyłączone, więc popraw mnie, jeśli tak. Wciąż uczę się świata R.Dodatkowo każde wyjaśnienie tego, co się tutaj dzieje, jest mile widziane (np. Odnoszące się do Pythona lub innego języka pomogłyby!)
r
dataframe
vector
type-conversion
Dolan Antenucci
źródło
źródło
?'[.data.frame'
zabierze Cię bardzo daleko.Odpowiedzi:
Spróbuję to wyjaśnić bez popełniania błędów, ale założę się, że spowoduje to wyjaśnienie lub dwa w komentarzach.
Ramka danych to lista. Kiedy podzbirujesz ramkę danych przy użyciu nazwy kolumny i
[
, otrzymujesz podlistę (lub pod ramkę danych). Jeśli chcesz rzeczywistą kolumnę atomową, możesz użyć[[
lub nieco myląco (dla mnie) możesz zrobićaframe[,2]
która zwraca wektor, a nie podlistę.Spróbuj więc uruchomić tę sekwencję, a może wszystko będzie jaśniejsze:
źródło
aframe[,"a2"]
ze względu na możliwość używania tego zarówno z ramkami danych, jak i macierzami i wydaje się, że otrzymuję te same wyniki - wektor.[..., drop = F]
zawsze zwróci ramkę danychdf$x
składnia zwraca wektor. Używałem tej składni przez długi czas, ale kiedy musiałem zacząć używaćdf['name']
lubdf[n]
pobierać kolumny, napotkałem problemy, gdy próbowałem wysłać je do funkcji, które oczekiwały wektorów. Używaniedf[[n]]
lubdf[['x']]
wyjaśnianie rzeczy.as.vector
wydaje się, że po cichu nie ma żadnego efektu? Czy to nie powinno albo zwrócić wektora, albo wyraźnie zawieść?aframe[['a2']]
jest bardzo przydatny w przypadkusf
obiektów, ponieważaframe[,"a2"]
zwróci dwie kolumny, ponieważ zawiera kolumnę geometrii.Jest teraz łatwy sposób na zrobienie tego za pomocą
dplyr
.źródło
Możesz użyć
$
ekstrakcji:lub podwójny nawias kwadratowy:
źródło
Nie potrzebujesz
as.vector()
, ale potrzebujesz poprawnego indeksowania:avector <- aframe[ , "a2"]
Należy pamiętać o
drop=FALSE
możliwości[
:źródło
drop=FALSE
jest przydatne - pomaga mi to w przypadkach, gdy mogę wybrać N kolumn z data.frame, w tych przypadkach, gdy N = 1.Kolejną zaletą stosowania operatora „[[” jest to, że działa on zarówno z danymi.frame, jak i data.table. Więc jeśli funkcja ma być uruchomiona zarówno dla data.frame, jak i data.table, a chcesz wyodrębnić z niej kolumnę jako wektor, to
jest najlepszy.
źródło
Możesz spróbować czegoś takiego-
źródło
identical
.Jeśli użyjesz tylko operatora wyodrębniania, zadziała. Domyślnie [] ustawia opcję
drop=TRUE
, której chcesz tutaj. Zobacz,?'['
aby uzyskać więcej informacji.źródło
źródło
źródło
Używam list do filtrowania ramek danych według tego, czy mają wartość% w% a lista.
Tworzyłem listy ręcznie, eksportując 1-kolumnową ramkę danych do programu Excel, gdzie dodawałem „” wokół każdego elementu, przed wklejeniem do R: list <- c („el1”, „el2”, ...), co zwykle było po którym następuje FilteredData <- podzbiór (Dane,% kolumny w% listy).
Po przeszukaniu stackoverflow i nie znalezieniu intuicyjnego sposobu konwertowania 1-kolumnowej ramki danych na listę, publikuję teraz mój pierwszy wkład w stackoverflow:
źródło
Możemy również ogólnie przekonwertować kolumny data.frame na prosty wektor.
as.vector
to za mało, gdyż zachowuje klasę i strukturę data.frame, więc musimy też wyciągnąć pierwszy (i jedyny) element:Wszystkie proponowane do tej pory rozwiązania wymagają zakodowania tytułów kolumn na sztywno. To czyni je niepogólnymi (wyobraź sobie, że stosujesz to do argumentów funkcji).
Alternatywnie możesz oczywiście najpierw przeczytać nazwy kolumn z kolumny, a następnie wstawić je do kodu w innych rozwiązaniach.
źródło