Anda tidak dapat melakukan subset semacam itu dengan $
. Dalam kode sumber ( R/src/main/subset.c
) itu menyatakan:
/ * Operator $ subset.
Kita perlu memastikan untuk hanya mengevaluasi argumen pertama.
Yang kedua akan menjadi simbol yang perlu dicocokkan, bukan dievaluasi.
* /
Argumen kedua? Apa?! Anda harus menyadari bahwa $
, seperti segala sesuatu yang lain di R, (termasuk misalnya (
, +
, ^
dll) adalah fungsi, yang mengambil argumen dan dievaluasi. df$V1
bisa ditulis ulang sebagai
`$`(df , V1)
atau memang
`$`(df , "V1")
Tapi...
`$`(df , paste0("V1") )
... misalnya tidak akan pernah berhasil, begitu pula hal lain yang harus dievaluasi terlebih dahulu dalam argumen kedua. Anda hanya boleh meneruskan string yang tidak pernah dievaluasi.
Sebagai gantinya gunakan [
(atau [[
jika Anda ingin mengekstrak hanya satu kolom sebagai vektor).
Sebagai contoh,
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]
Anda dapat melakukan pengurutan tanpa loop, menggunakan do.call
untuk membuat panggilan ke order
. Berikut adalah contoh yang dapat direproduksi di bawah:
# 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
Jika saya mengerti dengan benar, Anda memiliki vektor yang berisi nama variabel dan ingin mengulang melalui setiap nama dan mengurutkan bingkai data Anda dengan mereka. Jika demikian, contoh ini akan menggambarkan solusi untuk Anda. Masalah utama dalam Anda (contoh penuh tidak lengkap jadi saya "m tidak yakin apa lagi Anda mungkin hilang) adalah bahwa hal itu harus
order(Q1_R1000[,parameter[X]])
bukanorder(Q1_R1000$parameter[X])
, karena parameter adalah obyek eksternal yang berisi nama variabel lawan kolom langsung kerangka data Anda (yang mana$
akan sesuai).sumber
Menggunakan dplyr menyediakan sintaks yang mudah untuk menyortir bingkai data
Mungkin berguna untuk menggunakan versi NSE seperti yang ditunjukkan di sini untuk memungkinkan pembuatan daftar pengurutan secara dinamis
sumber
Solusi lain adalah menggunakan #get:
sumber
Mengalami masalah serupa karena beberapa file CSV yang memiliki berbagai nama untuk kolom yang sama.
Inilah solusinya:
Saya menulis fungsi untuk mengembalikan nama kolom valid pertama dalam daftar, lalu menggunakan itu ...
sumber
Jika Anda ingin memilih kolom dengan nama tertentu maka lakukan saja
Anda dapat menjalankannya dalam lingkaran juga membalikkan cara untuk menambahkan nama dinamis misalnya jika A adalah bingkai data dan xyz adalah kolom yang diberi nama x maka saya melakukan seperti ini
sekali lagi ini juga dapat ditambahkan dalam lingkaran
sumber
sumber
terlambat .. tapi kurasa aku punya jawabannya -
Berikut contoh dataframe study.df saya -
Lalu -
sumber