Ngôn ngữ lập trình R/Dữ liệu có cấu trúc
Dữ liệu có cấu trúc: vector, ma trận, bảng (data frame)[sửa]
Giả sử ta muốn thực hiện sản xuất hàng loạt: Nếu ta bắt gặp bài toán phải tính diện tích của năm hình chữ nhật với chiều rộng 10, 20, 30, 40, 50 cm và chiều dài 15, 25, 35, 45, 55 cm. Bạn có thể kiên trì hơn tôi và gõ lần lượt năm lần theo bài toán mẫu trên, nhưng tôi sẵn sàng tăng số hình chữ nhật lên 100. R cho phép ta "sản suất hàng loạt" đơn giản và hiệu quả hơn nhiều:
> a = c(10,20,30,40,50) > b = c(15,25,35,45,55) > S = a * b > S
Trong quá trình trên ta đã gộp toàn bộ năm giá trị của chiều rộng vào một biến a, năm giá trị chiều dài vào một biến b. Có thể tưởng tượng a và b như các "mảng giấy nháp" lớn trong đó có năm ô, mỗi ô cho một giá trị. Hàm c() nhận vào các giá trị và thực hiện thao tác kết gộp đó. Khi ta cho hai mảng đó vào đầu vào của toán tử "*", từng ô con của a được nhân với từng ô con tương ứng của b, và cho ta một ô mẹ lớn S có năm con là năm diện tích mà ta muốn tính như bạn đã thấy.
Các cấu trúc kết gộp như vậy được gọi là mảng, trong trường hợp này là mảng một chiều, vector.
Tương tự, ta cũng có thể làm việc với một bảng vuông (hai chiều) hoặc nhiều chiều hơn các số, gọi là ma trận. Nếu bạn lo ngại thuật ngữ đó thì có thể gọi nó là: bảng số.
> A = array(1, c(3,3)) > B = array(2, c(3,3)) > M = A + B > A > B > M
Bạn quan sát và ta thấy rằng tương tự vector, ta có thể cộng ô với ô của hai bảng, đơn giản như các số đơn. Tuy nhiên có lẽ ta để ý hàm array(1,c(3,3)). Tôi cho rằng bạn có thể đoán được c(3,3) nghĩa là gì khi quan sát trên màn hình trả lời của R. Nếu không tôi đề nghị bạn thay c(4,5) vào đó và thử so sánh. Bạn cũng có thể là tương tự với số "1" ở đó, đây là giá trị khởi tạo của mảng, tất cả các ô được tạo ra se nhận giá trị này.
Tất nhiên với mảng và ma trận như vậy, ta nảy sinh vấn đề muốn thay đổi, hoặc một giá trị nằm trong đó, chẳng hạn phần tử thứ 3 của S. Ta có thể gọi giá trị
> S[3]
Hoặc thay đổi
> S[3] = 0 > S
Hay quan sát phần tử thứ 3.
Và tương tự với ma trận, tất nhiên ta có hai chỉ số
> M[1,2] > M[1,2] = 10 > M
Nếu bạn tình cờ biết đại số tuyến tính, thì tin vui là R cũng hiểu các phép toán đại số tuyến tính với vector và ma trận (ở đây). Tôi giả sử bạn cũng không biết gì về thứ đó như tôi nên chúng ta tiếp tục thảo luận về một cấu trúc khác: bảng dữ liệu (data frame.)
Có thể xem data frame là dạng dữ liệu thuộc loại em ruột của ma trận. Với ma trận, tất cả các phần tử phải thuộc cùng một loại nguyên tố, tức là ma trận có thể chứa các ô là numeric, logical hoặc character chứ không thể vừa kiểu này vừa kiểu kia. Điều này bất tiện, chẳng hạn khi ta muốn lưu dữ liệu mà cột thứ nhất là giới tính học sinh (character) cột thứ hai là điểm số (numeric). Data frame cho phép ta làm việc này, chẳng hạn:
> sex = c("m","f","m"); > score = c(7,9,8); > M = data.frame(sex,score); > rownames(M) = c("Nam","Anh","Man"); > M
Bạn có thể để ý hàng đầu tiên trên màn hình "sex", "score", và cột đầu tiên "Nam", "Anh", "Man" cùng với ô đầu tiên khuyết. Tương tự khi ta lập một bảng dữ liệu, hàng đầu tiên dùng để chỉ tên thuộc tính (ở đây là giới tính và điểm số), cột đầu tiên là tên đối tượng (ở đây là tên học sinh). Lưu ý chúng không thuộc về "ruột" của bảng số liệu, mà thuộc về riềm để qui chiếu số liệu trong bảng. Ta có thể xem
> M[1,2]; > M["Nam","score"];
Điều này tuy là cải tiến nhỏ, nhưng hết sức tiện lợi cho người xử lý số liệu
Trong thực tế, data frame thường sử dụng để xuất nhập số liệu qua tệp. Chẳng hạn muốn viết bảng trên ra file ta dùng lệnh
> write.table(M, file = "record.txt");
Bạn có thể kiểm tra thư mục hiện hành và mở tệp mới tạo, ngắm nghía tác phẩm mới của mình. Ta có thể nhập lại bảng số liệu đó từ file bằng lệnh
> N = read.table("record.txt"); > N
<< Mục lục