Konversi kolom data.frame ke vektor?

164

Saya memiliki kerangka data seperti:

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)

Saya mencoba yang berikut ini untuk mengubah salah satu kolom menjadi vektor, tetapi tidak berhasil:

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

Ini adalah satu-satunya solusi yang bisa saya buat, tapi saya berasumsi harus ada cara yang lebih baik untuk melakukan ini:

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

Catatan: Kosakata saya di atas mungkin tidak aktif, jadi tolong perbaiki saya jika demikian. Saya masih belajar dunia R. Selain itu, penjelasan apa pun yang terjadi di sini sangat dihargai (yaitu yang berkaitan dengan Python atau bahasa lain akan membantu!)

Dolan Antenucci
sumber
5
Seperti yang Anda lihat di jawaban, pembacaan yang cermat ?'[.data.frame'akan membawa Anda jauh.
joran

Jawaban:

208

Saya akan mencoba menjelaskan ini tanpa membuat kesalahan, tapi saya yakin ini akan menarik satu atau dua klarifikasi di komentar.

Frame data adalah daftar. Saat Anda mengelompokkan frame data menggunakan nama kolom dan [, apa yang Anda dapatkan adalah sublist (atau sub frame data). Jika Anda menginginkan kolom atom yang sebenarnya, Anda dapat menggunakan [[, atau agak membingungkan (bagi saya), Anda dapat melakukan aframe[,2]yang mengembalikan vektor, bukan sublist.

Jadi coba jalankan urutan ini dan mungkin segalanya akan lebih jelas:

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

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

avector <- aframe[,2]
class(avector)
joran
sumber
6
+1 Ini bermanfaat. Saya sudah terbiasa menggunakan aframe[,"a2"]karena kemampuan untuk menggunakan ini dengan baik frame data dan matriks & tampaknya mendapatkan hasil yang sama - vektor.
Iterator
8
[..., drop = F]akan selalu mengembalikan bingkai data
hadley
1
Ini sangat baik untuk diketahui karena df$xsintaks mengembalikan vektor. Saya menggunakan sintaks ini untuk waktu yang lama, tetapi ketika saya harus mulai menggunakan df['name']atau df[n]untuk mengambil kolom, saya mengalami masalah ketika saya mencoba mengirimnya ke fungsi yang diharapkan vektor. Menggunakan df[[n]]atau df[['x']]membereskan semuanya.
rensa
8
Mengapa as.vectortampaknya diam-diam tidak berpengaruh? Bukankah ini seharusnya mengembalikan vektor atau gagal?
bli
aframe[['a2']]sangat berguna dengan sfobjek karena aframe[,"a2"]akan mengembalikan dua kolom karena kolom geometri disertakan.
Matt
41

Sekarang ada cara mudah untuk melakukan ini menggunakan dplyr.

dplyr::pull(aframe, a2)
Andrew Brēza
sumber
32

Anda dapat menggunakan $ekstraksi:

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

atau braket persegi ganda:

class(aframe[["a1"]])
[1] "numeric"
James
sumber
21

Anda tidak perlu as.vector(), tetapi Anda perlu pengindeksan yang benar:avector <- aframe[ , "a2"]

Satu hal yang perlu diperhatikan adalah drop=FALSEopsi untuk [:

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> 
Dirk Eddelbuettel
sumber
4
+1: Pengingat drop=FALSEberguna - ini membantu saya dalam kasus di mana saya dapat memilih N kolom dari data.frame, dalam kasus-kasus di mana N = 1.
Iterator
Saya menggunakan ini ketika saya tidak dapat melihat jumlah kolom yang dipilih dan jika satu kolom muncul, hasilnya masih akan diteruskan sebagai data.frame dengan n kolom. Vektor dapat melempar kunci inggris ke fungsi di telepon.
Roman Luštrik
11

Keuntungan lain menggunakan operator '[['] adalah ia berfungsi baik dengan data.frame dan data.table. Jadi jika fungsi harus dibuat berjalan untuk data.frame dan data.table, dan Anda ingin mengekstrak kolom dari itu sebagai vektor, maka

data[["column_name"]] 

paling baik.

joel.wilson
sumber
8

Anda dapat mencoba sesuatu seperti ini-

as.vector(unlist(aframe$a2))
Vaibhav Sharma
sumber
Ini bagus jika Anda ingin membandingkan dua kolom menggunakan identical.
p-robot
5

Jika Anda hanya menggunakan operator ekstrak, ia akan berfungsi. Secara default, [] menetapkan opsi drop=TRUE, yang Anda inginkan di sini. Lihat ?'['untuk lebih jelasnya.

>  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"
Ari B. Friedman
sumber
5
as.vector(unlist(aframe['a2']))
Dr_Hope
sumber
3
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"
shubham ranjan
sumber
2

Saya menggunakan daftar untuk memfilter dataframe dengan apakah mereka memiliki nilai% dalam% daftar.

Saya telah secara manual membuat daftar dengan mengekspor kerangka data 1 kolom ke Excel di mana saya akan menambahkan "", di sekitar setiap elemen, sebelum menempel ke R: daftar <- c ("el1", "el2", ...) yang biasanya diikuti oleh FilteredData <- subset (Data, Kolom% dalam daftar%).

Setelah mencari stackoverflow dan tidak menemukan cara intuitif untuk mengubah dataframe 1 kolom menjadi daftar, saya sekarang memposting kontribusi stackoverflow pertama saya:

# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
  list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")
Adrian DSouza
sumber
1

Kami juga dapat mengonversi kolom data.frame secara umum ke vektor sederhana. as.vectortidak cukup karena mempertahankan kelas dan struktur data.frame, jadi kami juga harus mengeluarkan elemen pertama (dan hanya):

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

Semua solusi yang disarankan sejauh ini memerlukan judul kolom hardcoding. Ini membuatnya non-generik (bayangkan menerapkan ini ke argumen fungsi).

Sebagai alternatif, Anda tentu saja dapat membaca nama kolom dari kolom terlebih dahulu dan kemudian memasukkannya ke dalam kode di solusi lain.

0range
sumber