2013-04-09 41 views
54

Sự khác nhau giữa dataframedanh sách trong R? Cái nào nên được sử dụng khi nào? Vòng lặp nào dễ hơn?Sự khác biệt giữa dataframe và danh sách trong R là gì?

Vấn đề chính xác: Trước tiên, tôi phải lưu trữ 3 thành phần chuỗi như "a", "b", "c". Sau đó, tôi cần thêm 3 yếu tố nữa; ví dụ cho "a" tôi phải thêm "a1", "a2", "a3". Sau đó tôi phải sử dụng lồng nhau cho các vòng lặp để truy cập các phần tử này.

Vì vậy, tôi bối rối khi sử dụng dataframe hoặc danh sách hoặc một số loại dữ liệu khác, trong đó trước tiên tôi có thể lưu trữ và sau đó nối thêm (loại mỗi cột)?

Hiện nay tôi đang nhận lỗi, như "số hạng mục để thay thế không phải là một bội số của chiều dài thay thế"

+0

Tôi nghĩ đây có thể giúp bạn .. http://www.r-tutor.com/r- giới thiệu/khung dữ liệu và http://www.r-tutor.com/r-introduction/list – Futuregeek

+0

Có phải đó thực sự là câu hỏi tồi không? Tôi là một newbee trong R và đến từ java và C#, ngôn ngữ kịch bản này dường như khó khăn ... :( – ShazSimple

+1

@ShazSimple Câu hỏi chính nó không phải là xấu.Nó chỉ là quá chung chung.Nếu bạn muốn có một giải pháp cho vấn đề cụ thể của bạn , bạn sẽ phải trình bày chúng tôi với một ví dụ tái sản xuất tối thiểu, như được giải thích [ở đây] (http: // stackoverflow.com/questions/5963269/cách thực hiện-một-tuyệt-tái-ví dụ). Để làm được điều đó, hãy tạo một câu hỏi mới. Chúng ta có thể để cái này ở đây để tham khảo. –

Trả lời

95

Câu hỏi đặt ra không phải là ngu ngốc như một số người nghĩ rằng đó là. Tôi biết rất nhiều người đấu tranh với sự khác biệt đó, và những gì để sử dụng ở đâu. Để tóm tắt:

Danh sách là cấu trúc dữ liệu linh hoạt nhất trong R. Chúng có thể được xem như một tập hợp các phần tử mà không bị giới hạn về lớp, độ dài hoặc cấu trúc của mỗi phần tử. Điều duy nhất bạn cần phải chăm sóc, là bạn không cho hai yếu tố cùng tên. Điều đó có thể gây ra rất nhiều rắc rối, và R không cho lỗi cho điều đó:

> X <- list(a=1,b=2,a=3) 
> X$a 
[1] 1 

khung dữ liệu là danh sách là tốt, nhưng họ có một vài hạn chế:

  • bạn không thể sử dụng cùng tên cho hai biến khác nhau
  • tất cả các phần tử của khung dữ liệu là các vectơ
  • tất cả các phần tử của một khung dữ liệu có độ dài bằng nhau.

Do những hạn chế này và cấu trúc hai chiều kết quả, khung dữ liệu có thể mimick một số hành vi của ma trận. Bạn có thể chọn các hàng và thực hiện các thao tác trên các hàng. Bạn không thể làm điều đó với danh sách, vì một hàng là không xác định ở đó.

Tất cả điều này ngụ ý rằng bạn nên sử dụng khung dữ liệu cho bất kỳ tập dữ liệu nào phù hợp với cấu trúc hai chiều đó. Về cơ bản, bạn sử dụng các khung dữ liệu cho bất kỳ tập dữ liệu nào trong đó một cột trùng với một biến và một hàng trùng với một quan sát duy nhất theo nghĩa rộng của từ đó. Đối với tất cả các cấu trúc khác, danh sách là cách để đi.

Lưu ý rằng nếu bạn muốn có cấu trúc lồng nhau, bạn phải sử dụng danh sách. Vì các phần tử của danh sách có thể tự liệt kê, bạn có thể tạo các đối tượng có cấu trúc rất linh hoạt.

+1

Câu hỏi tiếp theo: Tôi có ba khung dữ liệu lớn và tôi phải thực hiện một số chức năng thống nhất trên chúng. Tôi có nên đặt chúng trong một danh sách và 'lapply' hay tôi nên giữ chúng riêng biệt? Mà một trong những sẽ mất ít số điện thoại trên bộ nhớ của tôi và ít có khả năng để giải phóng máy tính của tôi? – vagabond

+1

@vagabond Tôi nên kiểm tra điều này, nhưng tôi nghi ngờ rằng cổ chai sẽ là việc tạo ra danh sách sửa đổi bởi lapply. Bạn có thể tự kiểm tra với Rprofmem và tracemem nếu bạn muốn. –

0

Nhìn vào ví dụ: Nếu bạn sử dụng áp dụng thay vì sapply để có được lớp -

apply(iris,2,class) # function elements are rows or columns 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
"character" "character" "character" "character" "character" 

sapply(iris,class) # function elements are variables 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
"numeric" "numeric" "numeric" "numeric"  "factor" 
Các vấn đề liên quan