Konwertuj wiersz ramki danych na wektor


116

Chcę utworzyć wektor z wiersza ramki danych. Ale nie chcę mieć nazw wierszy i kolumn. Próbowałem kilku rzeczy ... ale nie miałem szczęścia.

To jest moja ramka danych:

> 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

Próbowałem:

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

Ale naprawdę chcę czegoś takiego:

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

Sugeruję prawidłowe sformatowanie wyświetlanych danych. Wygląda na to, że brakuje niektórych znaków końca wiersza.
Chinmay Patil

Chcę rząd. Wiersz „1”, a nie kolumna „a”.
Joko,

Czy istnieje sposób na zastosowanie tego do wszystkich wierszy ramki danych, a tym samym scalenie wszystkich wektorów w jeden wektor?
stephanmg

1
@stephanmg: Co o coś takiego: c(t(as.matrix(df)))?
Andri Signorell

Andri: To działa, chociaż ja też mógłbym rozwiązać to inaczej.
stephanmg

Odpowiedzi:


154

Kiedy wyodrębniasz pojedynczy wiersz z ramki danych, otrzymasz jednorzędową ramkę danych. Zamień go na wektor numeryczny:

as.numeric(df[1,])

Jak sugeruje @Roland, unlist(df[1,])konwertuje jednorzędową ramkę danych na wektor numeryczny bez pomijania nazw. Dlatego unname(unlist(df[1,]))jest inny, nieco bardziej wyraźny sposób na osiągnięcie tego samego wyniku.

Jak komentuje @Josh poniżej, jeśli masz ramkę danych nie do końca numeryczną (alfabetyczną, dzieloną, mieszaną ...), potrzebujesz as.character(df[1,])zamiast tego.


może to być +1 (lub 0 głosów w dół) dla PO za podanie kodu, który jasno ilustruje, czego chcą, mimo że tekst i tytuł pytania były zniekształcone ...
Ben Bolker

@ChinmayPatil, jakie są inne opcje? Ich przykład kodu z pewnością sprawia, że ​​wygląda na to, że tego chcą.
Ben Bolker

2
Należy zauważyć, że ramka danych jest już wektorem, a zatem jak. Wektor widzi, że jest wektorem trybu „lista” i nic nie robi. Aby ułatwić zrozumienie podstawowych mechanizmów, spróbuj as.vector (df [1,], mode = "numeric"), co jest bardziej ilustracyjne. To właśnie robi as.numeric.

1
nie ma problemu. Twierdzę tylko, że na ten problem podają dokładnie taką samą odpowiedź.
Ben Bolker

1
Mogło się w międzyczasie zmienić, ale dziś niepubliczne pozwala na upuszczanie nazw: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (a przy okazji df nadal nie jest rozsądną nazwą dla data.frame ... ;-))
Andri Signorell

45

Polecam unlist, który zachowuje nazwy.

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

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

Jeśli nie chcesz nazwanego wektora:

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

7

Jeśli nie chcesz zmieniać na numeryczne, możesz spróbować tego.

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

3
To nie ma sensu dla mnie str(as.vector(t(df)[,1]))jest num [1:3] 1 2 2.6, czyli kod jest przekształcanie wyników z wektorem numerycznej ...
Ben Bolker

2
w szczególności, gdy używasz t(df)R przekształca ramkę danych w macierz, w tym przypadku macierz numeryczną, ponieważ wszystkie elementy są numeryczne. Następnie [,1]wyodrębnia pierwszą kolumnę (wektor numeryczny, ponieważ nadmiarowy wymiar jest automatycznie usuwany). as.vector()po prostu upuszcza nazwy (które możesz również zrobić unname()).
Ben Bolker,

Wydaje się, że działa to również w przypadku postaci. Ale masz rację co do przymusu. FWIW, moje rozwiązanie będzie działać również na ramkach danych znakowych ... z zastrzeżeniem, że wszystkie dane są konwertowane na znak
Chinmay Patil

2
Powiedziałbym, że unname(unlist(x))rozwiązanie jest trochę lepsze (wydajniejsze i bardziej przejrzyste).
Ben Bolker,

as.vector(t(df)[,1])Kocham to ! Dokładnie to, czego potrzebuję!
Uther Pendragon

7

Oto dplyropcja oparta na:

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

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

2

Pamiętaj, że musisz uważać, jeśli wiersz zawiera czynnik. Oto przykład:

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

Oto kolejny przykład (domyślnie data.frame () konwertuje znaki na współczynniki)

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"

Aby temu zapobiec, musisz zadbać o czynnik, zanim go wyodrębnisz:

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

Kolumny ramek danych są już wektorami, wystarczy je wyciągnąć. Zwróć uwagę, że umieszczasz żądaną kolumnę po przecinku, a nie przed nim:

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

Jeśli naprawdę chcesz wiersz, zrób to, co powiedział Ben i używaj poprawnie słów w przyszłości.


ale myślę, że OP chce pierwszego rzędu ?
Ben Bolker

1
@BenBolker Może tak ... Po prostu założyłem, że chciał tego, czego chciał jego tytuł i pytanie.
Jonathan Christensen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.