Veri çerçevesinin bir satırını vektöre dönüştürme


116

Bir veri çerçevesinin bir satırından bir vektör oluşturmak istiyorum. Ancak satır ve sütun adlarına sahip olmak istemiyorum. Birkaç şey denedim ... ama şansım olmadı.

Bu benim veri çerçevem:

> 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

Denedim:

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

Ama gerçekten böyle bir şey istiyorum:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6

Gösterdiğiniz verileri doğru şekilde biçimlendirmenizi öneririm. Görünüşe göre bazı satır sonlarını kaçırıyorsunuz.
Chinmay Patil

Bir sıra istiyorum. Satır '1', 'a' sütunu değil.
Joko

Bunu bir veri çerçevesinin tüm satırlarına uygulamanın ve böylece tüm vektörleri tek bir vektörde birleştirmenin bir yolu var mı?
stephanmg

1
@stephanmg: böyle bir şey hakkında ne c(t(as.matrix(df)))?
Andri Signorell

Andri: Bu işe yarıyor, ama ben de farklı şekilde çözebilirim.
stephanmg

Yanıtlar:


154

Bir veri çerçevesinden tek bir satır çıkardığınızda, tek satırlık bir veri çerçevesi elde edersiniz. Sayısal bir vektöre dönüştürün:

as.numeric(df[1,])

@Roland'ın önerdiği gibi, unlist(df[1,])tek satırlı veri çerçevesini isimleri düşürmeden sayısal bir vektöre dönüştürecektir. Bu nedenle unname(unlist(df[1,])), aynı sonuca ulaşmanın başka, biraz daha açık bir yoludur.

Aşağıda @ Josh'un yorumladığı gibi, tamamen sayısal olmayan (alfabetik, faktör, karma ...) bir veri çerçeveniz varsa, as.character(df[1,])bunun yerine ihtiyacınız var .


Sorunun metni ve başlığı bozuk olsa bile istediklerini açıkça gösteren kodu verdiği için
OP'ye

@ChinmayPatil, diğer seçenekleri neler? Kod örnekleri, kesinlikle istedikleri gibi görünmesini sağlıyor.
Ben Bolker

2
Bir veri çerçevesinin zaten bir vektör olduğu ve bu nedenle as.vector'ün bunu bir mod "listesi" vektörü olarak gördüğü ve hiçbir şey yapmadığı unutulmamalıdır. Altta yatan mekanizmaların anlaşılmasını kolaylaştırmak için daha açıklayıcı olan as.vector (df [1,], mode = "numeric") deneyin. Bu as.numeric'in yaptığı şeydir.

1
sorun değil. Sadece bu problem için tamamen aynı cevabı verdiklerini söylüyorum .
Ben Bolker

1
Bu arada değiştirilmiş olabilir, ancak bugün liste dışı isimlerin çıkarılmasına izin veriyor: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (ve btw df hala bir data.frame için mantıklı bir isim değil ... ;-))
Andri Signorell

45

unlistİsimleri koruyan tavsiye ederim .

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

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

Adlandırılmış bir vektör istemiyorsanız:

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

7

Sayısal olarak değiştirmek istemiyorsanız, bunu deneyebilirsiniz.

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6

3
Bu bana çok mantıklı değil: str(as.vector(t(df)[,1]))olduğu num [1:3] 1 2 2.6, yani kodunuzu gelmez sayısal vektör sonuçları dönüştürmek ...
Ben Bolker

2
özellikle, t(df)R kullandığınızda , veri çerçevesini bir matrise zorlar, bu durumda bir sayısal matris çünkü tüm öğeler sayısaldır. Daha sonra [,1]ilk sütunu çıkarır (sayısal bir vektör, çünkü gereksiz boyut otomatik olarak bırakılır). as.vector()sadece isimleri bırakır (bununla da yapabilirsiniz unname()).
Ben Bolker

Karakterler için de işe yarıyor gibi görünüyor. Ama dönüştürme konusunda haklısın. FWIW, benim çözümüm karakter veri çerçeveleri üzerinde de çalışacak .. karaktere dönüştürülen tüm verilerin uyarısı ile
Chinmay Patil

2
unname(unlist(x))Çözümün biraz daha iyi (daha verimli ve daha şeffaf) olduğunu söyleyebilirim .
Ben Bolker

as.vector(t(df)[,1])Onu seviyorum ! Tam olarak ihtiyacım olan şey!
Uther Pendragon

7

İşte dplyrtemelli bir seçenek:

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

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

2

Sıranız bir faktör içeriyorsa dikkatli olmanız gerektiğini unutmayın. İşte bir örnek:

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

İşte başka bir örnek (varsayılan olarak data.frame () karakterleri faktörlere dönüştürür)

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"

Bu davranışı önlemek için, çıkarmadan önce faktöre dikkat etmeniz gerekir:

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"

-3

Veri çerçevelerinin sütunları zaten vektörlerdir, sadece onları çıkarmanız gerekir. İstediğiniz sütunu virgülden önce değil, sonra koyduğunuzu unutmayın:

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

Gerçekten bir kavga istiyorsanız, Ben'in dediğini yapın ve lütfen ileride kelimeleri doğru şekilde kullanın.


ama bence OP ilk sırayı istiyor ?
Ben Bolker

1
@BenBolker Belki öyle ... Sadece başlığının ve sorusunun istediğini istediğini varsaydım.
Jonathan Christensen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.