Nie możesz zrobić tego rodzaju podzbiorów $
. W kodzie źródłowym ( R/src/main/subset.c
) stwierdza:
/ * Operator $ podzbioru.
Musimy być pewni, że oceniamy tylko pierwszy argument.
Drugi będzie symbolem, który należy dopasować, a nie oceniać.
* /
Drugi argument? Co?! Trzeba zdać sobie sprawę, że $
, jak wszystko inne w R, (w tym na przykład (
, +
, ^
etc) jest funkcją, która trwa argumentów i jest oceniany. df$V1
można przepisać jako
`$`(df , V1)
lub rzeczywiście
`$`(df , "V1")
Ale...
`$`(df , paste0("V1") )
... na przykład nigdy nie zadziała, ani nic innego, co musi najpierw zostać ocenione w drugim argumencie. Możesz przekazać tylko ciąg, który nigdy nie jest oceniany.
Zamiast tego użyj [
(lub [[
jeśli chcesz wyodrębnić tylko jedną kolumnę jako wektor).
Na przykład,
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]
Możesz wykonać porządkowanie bez pętli, używając do.call
do skonstruowania wywołania order
. Oto powtarzalny przykład poniżej:
# 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
Jeśli dobrze rozumiem, masz wektor zawierający nazwy zmiennych i chciałbyś zapętlić każdą nazwę i posortować według nich ramki danych. Jeśli tak, ten przykład powinien zilustrować rozwiązanie dla Ciebie. Podstawowym problemem w twoim (pełny przykład nie jest kompletny, więc nie jestem pewien, czego jeszcze możesz brakować) jest to, że powinno być
order(Q1_R1000[,parameter[X]])
zamiastorder(Q1_R1000$parameter[X])
, ponieważ parametr jest zewnętrznym obiektem, który zawiera nazwę zmiennej w przeciwieństwie do bezpośredniej kolumny ramki danych (które, gdy$
byłoby właściwe).źródło
Użycie dplyr zapewnia łatwą składnię do sortowania ramek danych
Przydatne może być użycie wersji NSE, jak pokazano tutaj, aby umożliwić dynamiczne budowanie listy sortowania
źródło
Innym rozwiązaniem jest użycie #get:
źródło
Miałem podobny problem z powodu niektórych plików CSV, które miały różne nazwy dla tej samej kolumny.
To było rozwiązanie:
Napisałem funkcję zwracającą pierwszą prawidłową nazwę kolumny na liście, a następnie użyłem jej ...
źródło
jeśli chcesz wybrać kolumnę o określonej nazwie, po prostu zrób
możesz uruchomić to w pętli, a także w odwrotny sposób, aby dodać dynamiczną nazwę np. jeśli A jest ramką danych, a xyz jest kolumną, którą należy nazwać jako x, to lubię to
ponownie można to również dodać w pętli
źródło
źródło
za późno ... ale chyba mam odpowiedź -
Oto moja przykładowa ramka danych study.df -
I wtedy -
źródło