Jak nazywać zmienne w locie?

96

Czy jest możliwe tworzenie nowych nazw zmiennych w locie?

Chciałbym wczytać ramki danych z listy do nowych zmiennych z numerami na końcu. Coś jak orca1, orca2, orca3 ...

Jeśli spróbuję czegoś takiego

paste("orca",i,sep="")=list_name[[i]]

Otrzymuję ten błąd

target of assignment expands to non-language object

Czy jest inny sposób obejścia tego?

Maiasaura
źródło
10
Dopóki rozdajemy tagi r-faq, podajmy link (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Odpowiedzi:

118

Zastosowanie assign:

assign(paste("orca", i, sep = ""), list_name[[i]])
Shane
źródło
28
Oto jak to zrobić. Jest tutaj metapytanie, które brzmi: „Czy powinienem to zrobić?” Prawie zawsze odpowiedź brzmi „nie”. Nazwane elementy na liście są prawie zawsze preferowane.
Ari B. Friedman
26
Prawie zawsze odpowiedź brzmi „nie”, chyba że tak nie jest.
Shane
9
Ależ oczywiście. Jednak większość osób poszukujących tej odpowiedzi nie robi tego z powodu odrzucenia listy zgłoszeń.
Ari B. Friedman
@Ari B. Friedman Generuję nazwy zmiennych dla zbiorów danych, które zapisuję w mypackage / data. Każdy w swoim pliku o tej samej nazwie dla pliku i danych w nim (podane zalecenia R dotyczące danych w pakiecie). Każdy zestaw danych to około 10 M, a całkowita to ~ 17 Go. Prawie nie widzę innego sposobu.
cmbarbu
3
Czy jest jakiś powód, dla którego nie używałeś paste0?
BroVic,
33

Wydaje mi się, że może być lepiej z listy zamiast używać orca1, orca2itp ... to byłoby orca[1], orca[2]...

Zwykle tworzysz listę zmiennych różniących się tylko liczbą, ponieważ ta liczba byłaby wygodnym sposobem późniejszego dostępu do nich.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

W przeciwnym razie assignjest to, czego chcesz.

Jan
źródło
11
Zgadzam się. Zwykle, gdy ludzie myślą, że chcą nazywać zmienne w locie, tak naprawdę chcą innej struktury danych.
Michael Dunn
9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/ ... ) ładnie to omawia
Ben Bolker
11

Nie twórz ramek danych. Zachowaj listę, nazwij jej elementy, ale nie dołączaj jej.

Głównym tego powodem jest to, że jeśli tworzysz zmienne w ruchu, prawie zawsze będziesz później musiał powtórzyć każdy z nich, aby wykonać coś pożytecznego. Tam ponownie będziesz zmuszony do iteracji przez każdą z nazw, które utworzyłeś w locie.

O wiele łatwiej jest nazwać elementy listy i iterować po nazwach.

Jeśli chodzi o dołączanie, jest to naprawdę zła praktyka programowania w R i może prowadzić do wielu problemów, jeśli nie będziesz ostrożny.

sidquanto
źródło
Więc zrobić załączanie, ale dopiero po wykonaniu iteracji listy?
Mox
4

FAQ mówi:

Jeśli masz

varname <- c("a", "b", "d")

możesz to zrobić

get(varname[1]) + 2

dla

a + 2

lub

assign(varname[1], 2 + 2)

dla

a <- 2 + 2

Wygląda więc na to, że używasz GET, gdy chcesz oszacować formułę, która używa zmiennej (takiej jak konkatenacja), i ASSIGN, gdy chcesz przypisać wartość do wstępnie zadeklarowanej zmiennej.

Składnia przypisania: przypisać (x, wartość)

x: nazwa zmiennej podana jako ciąg znaków. Żadne wymuszenie nie jest wykonywane, a pierwszy element wektora znakowego o długości większej niż jeden zostanie użyty z ostrzeżeniem.

wartość: wartość do przypisania x.

Mox
źródło
0

Innym trudnym rozwiązaniem jest nazwanie elementów listy i attachto:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa
Marek
źródło
14
trudne, ale nie mądre. jeśli odpowiedź brzmi, attachto zazwyczaj
zadajesz
-1

A ta opcja?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

Działa doskonale. W podanym przykładzie brakuje pierwszej linii, a następnie pojawia się komunikat o błędzie.

gla
źródło
3
To nie dotyczy pytania OP. Mamy listę z ramkami danych i chcemy przypisać ją do ramek danych o nazwach orca1, orca2 itd.
zx8754
"Lista z ramkami danych" = "lista ramek danych"?
Mox