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?


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]])

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.


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.


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.


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.