it-swarm.com.de

Konvertieren Sie eine Zeile eines Datenrahmens in einen Vektor

Ich möchte einen Vektor aus einer Zeile eines Datenrahmens erstellen. Aber ich möchte keine Reihen- und Spaltennamen haben. Ich habe mehrere Dinge ausprobiert ... hatte aber kein Glück.

Dies ist mein Datenrahmen:

> 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

Ich habe es versucht:

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

Aber ich möchte wirklich, dass etwas so aussieht:

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

Jede Hilfe, sehr geschätzt.

83
Joko

Wenn Sie eine einzelne Zeile aus einem Datenrahmen extrahieren, erhalten Sie einen einzeiligen Datenrahmen. Konvertieren Sie es in einen numerischen Vektor: 

as.numeric(df[1,])

Wie von @Roland vorgeschlagen, konvertiert unlist(df[1,]) den einzeiligen Datenrahmen in einen numerischen Vektor, ohne die Namen zu löschen. Daher ist unname(unlist(df[1,])) ein anderer, etwas expliziterer Weg, um zum gleichen Ergebnis zu gelangen.

120
Ben Bolker

Ich empfehle unlist, wodurch die Namen beibehalten werden.

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

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

Wenn Sie keinen benannten Vektor wünschen:

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

Wenn Sie nicht auf numerisch wechseln möchten, können Sie dies versuchen.

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

Beachten Sie, dass Sie vorsichtig sein müssen, wenn Ihre Zeile einen Faktor enthält. Hier ist ein Beispiel:

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

Hier ist ein anderes Beispiel (standardmäßig konvertiert data.frame () Zeichen in Faktoren) 

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"

Um dieses Verhalten zu verhindern, müssen Sie sich um den Faktor kümmern, bevor Sie ihn extrahieren:

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

Hier ist eine dplyr-basierte Option:

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

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