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!)
r
dataframe
vector
type-conversion
Dolan Antenucci
sumber
sumber
?'[.data.frame'
akan membawa Anda jauh.Jawaban:
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 melakukanaframe[,2]
yang mengembalikan vektor, bukan sublist.Jadi coba jalankan urutan ini dan mungkin segalanya akan lebih jelas:
sumber
aframe[,"a2"]
karena kemampuan untuk menggunakan ini dengan baik frame data dan matriks & tampaknya mendapatkan hasil yang sama - vektor.[..., drop = F]
akan selalu mengembalikan bingkai datadf$x
sintaks mengembalikan vektor. Saya menggunakan sintaks ini untuk waktu yang lama, tetapi ketika saya harus mulai menggunakandf['name']
ataudf[n]
untuk mengambil kolom, saya mengalami masalah ketika saya mencoba mengirimnya ke fungsi yang diharapkan vektor. Menggunakandf[[n]]
ataudf[['x']]
membereskan semuanya.as.vector
tampaknya diam-diam tidak berpengaruh? Bukankah ini seharusnya mengembalikan vektor atau gagal?aframe[['a2']]
sangat berguna dengansf
objek karenaaframe[,"a2"]
akan mengembalikan dua kolom karena kolom geometri disertakan.Sekarang ada cara mudah untuk melakukan ini menggunakan
dplyr
.sumber
Anda dapat menggunakan
$
ekstraksi:atau braket persegi ganda:
sumber
Anda tidak perlu
as.vector()
, tetapi Anda perlu pengindeksan yang benar:avector <- aframe[ , "a2"]
Satu hal yang perlu diperhatikan adalah
drop=FALSE
opsi untuk[
:sumber
drop=FALSE
berguna - ini membantu saya dalam kasus di mana saya dapat memilih N kolom dari data.frame, dalam kasus-kasus di mana N = 1.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
paling baik.
sumber
Anda dapat mencoba sesuatu seperti ini-
sumber
identical
.Jika Anda hanya menggunakan operator ekstrak, ia akan berfungsi. Secara default, [] menetapkan opsi
drop=TRUE
, yang Anda inginkan di sini. Lihat?'['
untuk lebih jelasnya.sumber
sumber
sumber
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:
sumber
Kami juga dapat mengonversi kolom data.frame secara umum ke vektor sederhana.
as.vector
tidak cukup karena mempertahankan kelas dan struktur data.frame, jadi kami juga harus mengeluarkan elemen pertama (dan hanya):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.
sumber