Data.frame sütununu bir vektöre dönüştürür mü?


164

Ben gibi bir veri çerçevesi var:

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)

Sütunlardan birini bir vektöre dönüştürmek için aşağıdakileri denedim, ancak çalışmıyor:

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

Gelebileceğim tek çözüm bu, ama bunu yapmanın daha iyi bir yolu olması gerektiğini varsayıyorum:

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

Not: Yukarıdaki kelime bilgim kapalı olabilir, lütfen öyleyse lütfen beni düzeltin. Hala R dünyasını öğreniyorum. Ayrıca, burada neler olduğuna dair herhangi bir açıklama takdir ediliyor (yani Python veya başka bir dil ile ilgili yardımcı olur!)


5
Cevaplarda gördüğünüz gibi, yakın bir okuma ?'[.data.frame'sizi çok ileri götürecektir.
joran

Yanıtlar:


208

Bunu herhangi bir hata yapmadan açıklamaya çalışacağım, ancak bahse girerim yorumlarda bir veya iki açıklama çekecek.

Veri çerçevesi bir listedir. Bir sütunun adını kullanarak bir veri çerçevesini alt küme ve zaman [, ne alıyoruz bir olan alt liste (veya bir alt veri çerçeve). Gerçek atom sütununu kullanmak [[isterseniz aframe[,2], bir alt liste değil, bir vektör döndüren bir şey yapabilir veya biraz kafa karıştırıcı (bana göre) yapabilirsiniz .

Bu yüzden bu diziyi çalıştırmayı deneyin ve belki de işler daha net olacaktır:

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

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

avector <- aframe[,2]
class(avector)

6
+1 Bu faydalıdır. Bir aframe[,"a2"]veri - hem veri çerçeveleri ve matrisler ile bu kullanma yeteneği nedeniyle kullanmaya alışmıştı ve aynı sonuçları almak gibi görünüyor.
Iterator

8
[..., drop = F]her zaman bir veri çerçevesi döndürür
hadley

1
Bunu bilmek özellikle iyidir çünkü df$xsözdizimi bir vektör döndürür. Bu sözdizimini uzun süre kullandım, ancak sütunları kullanmaya df['name']veya df[n]almaya başlamak zorunda kaldığımda, bunları beklenen vektörlere sahip işlevlere göndermeye çalıştığımda sorunlara çarptım. Bir şeyleri doğrudan kullanmak df[[n]]veya df[['x']]temizlemek.
rensa

8
Neden as.vectorsessizce bir etkisi yok gibi görünüyor? Bu bir vektör döndürmemeli veya gözle görülür bir şekilde başarısız olmamalı mı?
bli

aframe[['a2']]geometri sütunu dahil edildiğinden iki sütun döndüreceğinden sfnesnelerle çok kullanışlıdır aframe[,"a2"].
Matt

41

Şimdi bunu kullanarak yapmanın kolay bir yolu var dplyr.

dplyr::pull(aframe, a2)

32

$Ekstraksiyon kullanabilirsiniz :

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

veya çift köşeli ayraç:

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

21

İhtiyacınız yok as.vector(), ancak doğru indekslemeye ihtiyacınız var:avector <- aframe[ , "a2"]

Dikkat edilmesi gereken bir başka şey drop=FALSEiçin bir seçenek [:

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> 

4
+1: hatırlatıcısı drop=FALSEyararlıdır - bir data.frame'den N sütun seçebileceğim durumlarda, N = 1 olduğu durumlarda bana yardımcı olur.
Iterator

Seçilen sütun sayısını öngöremediğimde ve bir sütun ortaya çıktığında, sonuç yine de n sütunlu bir data.frame olarak geçirildiğinde kullanıyorum. Bir vektör, bir İngiliz anahtarını hattaki işlevlere atabilir.
Roman Luštrik

11

'[[' Operatörünü kullanmanın bir diğer avantajı, hem data.frame hem de data.table ile çalışmasıdır. Eğer işlevin hem data.frame hem de data.table için çalıştırılması gerekiyorsa ve ondan bir sütunu vektör olarak çıkarmak istiyorsanız

data[["column_name"]] 

en iyisi.


8

Böyle bir şey deneyebilirsiniz-

as.vector(unlist(aframe$a2))

Bunu kullanarak iki sütunu karşılaştırmak istiyorsanız bu iyi olur identical.
p-robot

5

Sadece ayıklama işlecini kullanırsanız çalışır. Varsayılan olarak, [] drop=TRUEburada istediğiniz seçeneği belirler . Daha ?'['fazla ayrıntı için bakınız.

>  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"


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"

2

Listeleri% bir listede% değerine sahip olup olmadıklarına göre veri çerçevelerini filtrelemek için kullanıyorum.

Ben genellikle bir sütun R: list <- c ("el1", "el2", ...) ardından FilteredData <- alt kümesi (Veri,% listesinde Sütun%).

Stackoverflow aradıktan ve 1 sütun veri çerçevesini bir listeye dönüştürmek için sezgisel bir yol bulamadan sonra, şimdi ilk stackoverflow katkımı gönderiyorum:

# 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")

1

Ayrıca data.frame sütunlarını genel olarak basit bir vektöre dönüştürebiliriz. as.vectordata.frame sınıfını ve yapısını koruduğu için yeterli değildir, bu nedenle ilk (ve yalnızca) öğeyi de çekmeliyiz:

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

Şimdiye kadar önerilen tüm çözümler sabit kodlamalı sütun başlıkları gerektirir. Bu onları jenerik olmayan yapar (bunu işlev argümanlarına uyguladığınızı hayal edin).

Alternatif olarak, elbette önce sütundan sütun adlarını okuyabilir ve daha sonra diğer çözümlerin koduna ekleyebilirsiniz.

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.