Ubah baris bingkai data menjadi vektor

116

Saya ingin membuat vektor dari deretan bingkai data. Tapi saya tidak ingin nama baris dan kolom. Saya mencoba beberapa hal ... tetapi tidak berhasil.

Ini bingkai data saya:

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

Saya mencoba:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

Tapi saya sangat menginginkan sesuatu yang terlihat seperti ini:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6
Joko
sumber
Saya sarankan Anda memformat data yang telah Anda tunjukkan dengan benar. Sepertinya Anda melewatkan beberapa baris baru.
Chinmay Patil
Saya ingin satu baris. Baris '1' dan bukan kolom 'a'.
Joko
Adakah cara untuk menerapkan ini ke semua baris bingkai data dan dengan demikian menggabungkan semua vektor ke satu vektor?
stephanmg
1
@stephanmg: Bagaimana sesuatu seperti: c(t(as.matrix(df)))?
Andri Signorell
Andri: Itu berhasil, meski saya juga bisa menyelesaikannya dengan cara berbeda.
stephanmg

Jawaban:

154

Saat Anda mengekstrak satu baris dari bingkai data, Anda mendapatkan bingkai data satu baris. Ubah menjadi vektor numerik:

as.numeric(df[1,])

Seperti yang disarankan @Roland, unlist(df[1,])akan mengonversi bingkai data satu baris menjadi vektor numerik tanpa menghilangkan namanya. Oleh karena itu, unname(unlist(df[1,]))ada cara lain yang sedikit lebih eksplisit untuk mendapatkan hasil yang sama.

Seperti komentar @Josh di bawah ini, jika Anda memiliki bingkai data yang tidak sepenuhnya numerik (alfabet, faktor, campuran ...), Anda memerlukannya as.character(df[1,]).

Ben Bolker
sumber
mungkin ada +1 (atau 0 suara tidak suka) untuk OP karena memberikan kode yang menggambarkan dengan jelas apa yang mereka inginkan meskipun teks dan judul pertanyaan kacau ...
Ben Bolker
@ChinmayPatil, apa saja pilihan mereka yang lain? Contoh kode mereka pasti membuatnya terlihat seperti itu yang mereka inginkan.
Ben Bolker
2
Perlu dicatat bahwa bingkai data sudah menjadi vektor dan oleh karena itu, vektor melihatnya sebagai vektor mode "daftar" dan tidak melakukan apa pun. Untuk memfasilitasi pemahaman tentang mekanisme yang mendasari coba as.vector (df [1,], mode = "numeric") yang lebih ilustratif. Inilah yang dilakukan as.numeric.
1
tidak masalah. Saya hanya menyatakan bahwa untuk masalah ini mereka memberikan jawaban yang persis sama.
Ben Bolker
1
Mungkin telah diubah untuk sementara, tetapi hari ini unlist mengizinkan penghapusan nama: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (dan btw df masih bukan nama yang masuk akal untuk data.frame ... ;-))
Andri Signorell
45

Saya merekomendasikan unlist, yang menyimpan nama.

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

Jika Anda tidak ingin vektor bernama:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6
Roland
sumber
7

Jika Anda tidak ingin mengubah ke numerik, Anda dapat mencoba ini.

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6
Chinmay Patil
sumber
3
ini tidak masuk akal bagi saya: str(as.vector(t(df)[,1]))adalah num [1:3] 1 2 2.6, yaitu, kode Anda mengubah hasil menjadi vektor numerik ...
Ben Bolker
2
Khususnya, ketika Anda menggunakan t(df)R memaksa bingkai data menjadi matriks, dalam hal ini matriks numerik karena semua elemennya numerik. Kemudian [,1]mengekstrak kolom pertama (vektor numerik, karena dimensi redundan secara otomatis dihapus). as.vector()hanya menjatuhkan nama (yang juga dapat Anda lakukan dengan unname()).
Ben Bolker
Tampaknya berfungsi untuk karakter juga. Tapi Anda benar tentang koersi. FWIW, solusi saya akan bekerja pada bingkai data karakter juga .. dengan peringatan dari semua data yang diubah menjadi karakter
Chinmay Patil
2
Saya akan mengatakan bahwa unname(unlist(x))solusinya sedikit lebih baik (lebih efisien dan lebih transparan).
Ben Bolker
as.vector(t(df)[,1])Aku menyukainya ! Persis apa yang saya butuhkan!
Uther Pendragon
7

Berikut adalah dplyropsi berbasis:

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()
sbha
sumber
2

Perhatikan bahwa Anda harus berhati-hati jika baris Anda mengandung faktor. Berikut ini contohnya:

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

Berikut adalah contoh lain (secara default data.frame () mengonversi karakter menjadi faktor)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

Untuk mencegah perilaku ini, Anda perlu memperhatikan faktornya, sebelum mengekstraknya:

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"
Rtist
sumber
-3

Kolom bingkai data sudah menjadi vektor, Anda hanya perlu menariknya keluar. Perhatikan bahwa Anda menempatkan kolom yang Anda inginkan setelah koma, bukan sebelumnya:

> newV <- df[,1]
> newV
[1] 1 2 4 2

Jika Anda benar-benar menginginkan baris, lakukan apa yang Ben katakan dan tolong gunakan kata-kata dengan benar di masa depan.

Jonathan Christensen
sumber
tapi saya pikir OP ingin baris pertama ?
Ben Bolker
1
@BenBolker Mungkin begitu ... Saya hanya berasumsi bahwa dia menginginkan apa yang dia inginkan dari judul dan pertanyaannya.
Jonathan Christensen