Chuyển đổi một hàng của khung dữ liệu thành vectơ


116

Tôi muốn tạo một vectơ từ một hàng của khung dữ liệu. Nhưng tôi không muốn có tên hàng và cột. Tôi đã thử nhiều thứ ... nhưng không gặp may.

Đây là khung dữ liệu của tôi:

> 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

Tôi đã thử:

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

Nhưng tôi thực sự muốn một cái gì đó trông như thế này:

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

Tôi khuyên bạn nên định dạng dữ liệu bạn đã hiển thị đúng cách. Có vẻ như bạn đang thiếu một số ngắt dòng.
Chinmay Patil

Tôi muốn một hàng. Hàng '1' chứ không phải cột 'a'.
Joko

Có cách nào để áp dụng điều này cho tất cả các hàng của khung dữ liệu và do đó hợp nhất tất cả các vectơ thành một vectơ duy nhất không?
stephanmg

1
@stephanmg: Còn những thứ như c(t(as.matrix(df))):?
Andri Signorell 25/09/19

Andri: Điều đó đang hoạt động, mặc dù tôi cũng có thể giải quyết nó theo cách khác.
stephanmg

Câu trả lời:


154

Khi bạn trích xuất một hàng từ một khung dữ liệu, bạn sẽ nhận được một khung dữ liệu một hàng. Chuyển đổi nó thành một vectơ số:

as.numeric(df[1,])

Như @Roland gợi ý, unlist(df[1,])sẽ chuyển đổi khung dữ liệu một hàng thành vectơ số mà không bỏ tên. Do đó, unname(unlist(df[1,]))là một cách khác, rõ ràng hơn một chút để đạt được kết quả tương tự.

Như @Josh nhận xét bên dưới, nếu bạn có khung dữ liệu không phải hoàn toàn là số (chữ cái, thừa số, hỗn hợp ...), bạn cần as.character(df[1,])thay thế.


nó có thể là 1 (hoặc 0 xuống votes) để OP đã cho mã mà được minh họa rõ ràng những gì họ muốn, mặc dù nội dung và tiêu đề của câu hỏi đã bị cắt xén ...
Bến Bolker

@ChinmayPatil, các tùy chọn khác của họ là gì? Ví dụ mã của họ chắc chắn làm cho nó giống như những gì họ muốn.
Ben Bolker

2
Cần lưu ý rằng một khung dữ liệu đã là một vectơ và do đó as.vector xem nó là một vectơ của chế độ "danh sách" và không làm gì cả. Để dễ hiểu về các cơ chế cơ bản, hãy thử as.vector (df [1,], mode = "numeric") để minh họa rõ hơn. Đây là những gì as.numeric làm.

1
không vấn đề gì. Tôi chỉ nói rằng đối với vấn đề này, họ đưa ra câu trả lời chính xác như nhau.
Ben Bolker

1
Có thể đã bị thay đổi trong khi chờ đợi, nhưng hôm nay không công khai cho phép thả tên: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (và btw df vẫn không phải là một tên hợp lý cho một data.frame ... ;-))
Andri Signorell

45

Tôi đề nghị unlist, giữ các tên.

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

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

Nếu bạn không muốn một vectơ được đặt tên:

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

7

Nếu bạn không muốn thay đổi thành số, bạn có thể thử điều này.

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

3
điều này không có ý nghĩa nhiều với tôi: str(as.vector(t(df)[,1]))num [1:3] 1 2 2.6, tức là mã của bạn không chuyển đổi kết quả cho một vector số ...
Bến Bolker

2
cụ thể, khi bạn sử dụng t(df)R ép buộc khung dữ liệu thành một ma trận, trong trường hợp này là ma trận số vì tất cả các phần tử đều là số. Sau đó, [,1]trích xuất cột đầu tiên (một vectơ số, vì thứ nguyên dư thừa sẽ tự động bị loại bỏ). as.vector()chỉ bỏ tên (mà bạn cũng có thể làm với unname()).
Ben Bolker

Nó dường như cũng hoạt động cho các nhân vật. Nhưng bạn đã đúng về coersion. FWIW, giải pháp của tôi sẽ làm việc trên khung dữ liệu nhân vật cũng .. với caveat của tất cả các dữ liệu được chuyển đổi sang nhân vật
Chinmay Patil

2
Tôi muốn nói rằng unname(unlist(x))giải pháp tốt hơn một chút (hiệu quả hơn và minh bạch hơn).
Ben Bolker

as.vector(t(df)[,1])Tôi thích nó ! Chính xác những gì tôi cần nó!
Uther Pendragon

7

Đây là một dplyrtùy chọn dựa trên:

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

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

2

Lưu ý rằng bạn phải cẩn thận nếu hàng của bạn chứa một hệ số. Đây là một ví dụ:

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

Đây là một ví dụ khác (theo mặc định data.frame () chuyển đổi ký tự thành thừa số)

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"

Để ngăn chặn hành vi này, bạn cần quan tâm đến yếu tố trước khi giải nén nó:

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

Các cột của khung dữ liệu đã là vectơ, bạn chỉ cần kéo chúng ra. Lưu ý rằng bạn đặt cột bạn muốn sau dấu phẩy, không phải trước cột:

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

Nếu bạn thực sự muốn có một hàng, thì hãy làm theo những gì Ben đã nói và hãy sử dụng các từ một cách chính xác trong tương lai.


nhưng tôi nghĩ OP muốn hàng đầu tiên ?
Ben Bolker

1
@BenBolker Có lẽ vậy ... Tôi chỉ cho rằng anh ấy muốn danh hiệu và câu hỏi của anh ấy nói rằng anh ấy muốn gì.
Jonathan Christensen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.