Bạn không thể làm kiểu tập hợp con đó với $
. Trong mã nguồn ( R/src/main/subset.c
) nó nói:
/ * Toán tử tập con $.
Chúng ta cần đảm bảo chỉ đánh giá đối số đầu tiên.
Thứ hai sẽ là một biểu tượng cần được đối sánh, không được đánh giá.
* /
Lập luận thứ hai? Gì?! Bạn phải nhận ra rằng $
, giống như mọi thứ khác trong R, (bao gồm cả ví dụ (
, +
, ^
vv) là một chức năng, mà sẽ đưa lập luận và được đánh giá. df$V1
có thể được viết lại thành
`$`(df , V1)
hoặc thực sự
`$`(df , "V1")
Nhưng...
`$`(df , paste0("V1") )
... chẳng hạn sẽ không bao giờ hoạt động, cũng như bất kỳ thứ gì khác trước tiên phải được đánh giá trong đối số thứ hai. Bạn chỉ có thể chuyển một chuỗi không bao giờ được đánh giá.
Thay vào đó, hãy sử dụng [
(hoặc [[
nếu bạn chỉ muốn trích xuất một cột duy nhất dưới dạng vectơ).
Ví dụ,
var <- "mpg"
#Doesn't work
mtcars$var
#These both work, but note that what they return is different
# the first is a vector, the second is a data.frame
mtcars[[var]]
mtcars[var]
Bạn có thể thực hiện thứ tự mà không có vòng lặp, sử dụng do.call
để tạo lệnh gọi tới order
. Đây là một ví dụ có thể tái tạo bên dưới:
# set seed for reproducibility
set.seed(123)
df <- data.frame( col1 = sample(5,10,repl=T) , col2 = sample(5,10,repl=T) , col3 = sample(5,10,repl=T) )
# We want to sort by 'col3' then by 'col1'
sort_list <- c("col3","col1")
# Use 'do.call' to call order. Seccond argument in do.call is a list of arguments
# to pass to the first argument, in this case 'order'.
# Since a data.frame is really a list, we just subset the data.frame
# according to the columns we want to sort in, in that order
df[ do.call( order , df[ , match( sort_list , names(df) ) ] ) , ]
col1 col2 col3
10 3 5 1
9 3 2 2
7 3 2 3
8 5 1 3
6 1 5 4
3 3 4 4
2 4 3 4
5 5 1 4
1 2 5 5
4 5 3 5