2011-07-01 40 views
10

Tôi hiểu rằng tôi có thể đặt một data.frame như vậy:R - trật tự một data.frame theo tên cột AS CHARACTER

test = data.frame(A=c(4,2,4), B=c(8,3,2)) 
ordered = test[with(test, order(A,B)) , ] 

Nhưng làm cách nào để thực hiện được điều tương tự khi các cột được quy định theo cột tên là biến ký tự? Điều này dường như không hoạt động:

test = data.frame(A=c(4,2,4), B=c(8,3,2)) 
cols = c("A" , "B") 
ordered = test[ with(test, order(cols)) , ] 

Có cách nào để chuyển đổi "B" thành B để cột được nhận dạng không? Tôi dường như có vấn đề này khá thường xuyên với các chức năng lấy đầu vào tên cột. Có một số thuật ngữ để mô tả vấn đề này-không gian trong R (nhận dạng ký tự so với định danh không phải ký tự)?

+2

Tôi phải nói rằng tôi không hiểu tại sao câu hỏi này lại bị bỏ phiếu. Dường như yêu cầu được hỗ trợ trong việc tiếp cận "cấp độ tiếp theo" trong trừu tượng. Nếu đó là một bản sao thì cử tri ẩn danh nên bước lên và cho chúng tôi thấy. –

+1

@DWin - Tôi đánh giá cao sự hỗ trợ! Tôi cũng bị nhầm lẫn bởi downvote. – SFun28

Trả lời

10

Hãy thử thay vì:

ordered = test[ with(test, order(B)) , ] 

Hoặc:

ordered2 = test[ order(test[["B"]]) , ] 

Hình thức thứ hai sẽ cho phép bạn làm điều gì đó như:

colnm <- "B" 
ordered2 = test[ order(test[[colnm]]) , ] 

Đối với nhiều hơn một cột để đặt hàng bạn cần để sử dụng do.call (ví dụ từ trang trợ giúp):

d4 <- data.frame(x = round( rnorm(100)), y = round(10*runif(100)), 
        z = round(8*rnorm(100)), u = round(50*runif(100))) 
d4s <- d4[ do.call(order, d4[ , c("x", "y") ]), ] 
+0

mục đích của câu hỏi của tôi là cung cấp "B" (hoặc bất kỳ cột nào khác) theo tên trong một ký tự. Vì vậy, hãy tưởng tượng tôi đã có một biến toSort = c ("B", "A") – SFun28

+0

nói cách khác, tôi không biết trước thời gian mà cột tôi muốn sắp xếp ... Tôi muốn cung cấp dưới dạng tham số/biến. đã cập nhật câu hỏi của tôi để phản ánh điều này – SFun28

+0

@ SFun25: Xem phụ lục của tôi. –

Các vấn đề liên quan