Değişkenler anında nasıl adlandırılır?


99

Anında yeni değişken isimleri yaratmak mümkün mü?

Veri çerçevelerini bir listeden sonunda sayılarla yeni değişkenlere okumak istiyorum. Orca1, orca2, orca3 gibi bir şey ...

Gibi bir şey denersem

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

Bu hatayı alıyorum

target of assignment expands to non-language object

Bunun başka bir yolu var mı?


10
R-faq etiketleri verdiğimiz sürece bağlantıyı verelim (SSS 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Yanıtlar:


121

Kullanım assign:

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

28
Bunun nasıl yapılacağı budur. Burada bir meta-soru var, "Bunu yapmalı mıyım?" Cevap neredeyse her zaman "hayır" dır. Bir listedeki adlandırılmış öğeler neredeyse her zaman tercih edilir.
Ari B. Friedman

26
Cevap, olmadığı zamanlar dışında neredeyse her zaman "hayır" dır.
Shane

9
Tabii ki. Ancak bu yanıtı arayan çoğu insan, başvurusu için bir listeyi reddettiği için bunu yapmıyor.
Ari B. Friedman

@Ari B. Friedman Paket / veri olarak kaydettiğim veri kümeleri için değişken adları oluşturuyorum. Dosyasındaki her biri, dosya ve içindeki veriler için aynı ada sahip (paketteki veriler için R önerileri verilmiştir). Her bir veri kümesi yaklaşık 10 milyondur ve toplamı ~ 17Go Başka bir yol görmüyorum.
cmbarbu

4
Kullanmamanın herhangi bir nedeni var mı paste0?
BroVic

33

Bu liste ile daha iyi yerine kullanıyor olabilir geliyor bana orca1, orca2vb ... o zaman olurdu orca[1], orca[2]...

Genellikle bir sayıdan başka hiçbir şey içermeyen değişkenlerin bir listesini yaparsınız, çünkü bu sayı daha sonra bunlara erişmek için uygun bir yol olacaktır.

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

Aksi takdirde, assigntam istediğiniz şey budur.


11
Katılıyorum. Genellikle insanlar değişkenleri anında adlandırmak istediklerini düşündüklerinde, gerçekten istedikleri şey farklı bir veri yapısıdır.
Michael Dunn

9
+1 (SSS 7.21: cran.r-project.org/doc/FAQ/… ) bunu güzelce tartışıyor
Ben Bolker

11

Veri çerçeveleri yapmayın. Listeyi saklayın, öğelerini adlandırın ancak eklemeyin.

Bunun en büyük nedeni, hareket halindeyken değişkenler yaparsanız, hemen hemen her zaman daha sonra yararlı bir şey gerçekleştirmek için her birini yinelemek zorunda kalacağınızdır. Orada yine anında oluşturduğunuz isimleri yinelemeye zorlanacaksınız.

Listenin öğelerini adlandırmak ve adlar arasında yinelemek çok daha kolaydır.

Attach söz konusu olduğunda, R'deki gerçekten kötü programlama uygulaması ve dikkatli olmazsanız çok fazla soruna yol açabilir.


Öyleyse, bir ekleme yapın, ancak yalnızca listedeki yinelemeyi yaptıktan sonra mı?
Aylık

4

SSS diyor ki:

Eğer varsa

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

yapabilirsin

get(varname[1]) + 2

için

a + 2

veya

assign(varname[1], 2 + 2)

için

a <- 2 + 2

Bu nedenle, bir değişken kullanan (birleştirme gibi) bir formülü değerlendirmek istediğinizde GET ve önceden bildirilmiş bir değişkene bir değer atamak istediğinizde ASSIGN kullanıyormuşsunuz gibi görünüyor.

Atama sözdizimi: atama (x, değer)

x: bir karakter dizesi olarak verilen bir değişken adı. Zorlama yapılmaz ve birden büyük uzunluktaki bir karakter vektörünün ilk öğesi bir uyarı ile birlikte kullanılır.

değer: x'e atanacak değer.


0

Diğer bir aldatıcı çözüm, listenin öğelerini adlandırmaktır ve attach:

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
aldatıcı, ama akıllıca değil. cevap attachgenellikle yanlış soruyu
sormaksa

-1

Ve bu seçenek?

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

Mükemmel çalışıyor. Koyduğunuz örnekte, ilk satır eksik ve ardından size hata mesajını veriyor.


3
Bu, OP'nin sorusuna yanıt vermez. Veri çerçeveli bir listemiz var ve bunu orca1, orca2, vb. Olarak adlandırılan veri çerçevelerine atamak istiyoruz
zx8754

"Veri çerçeveli liste" = "veri çerçevesi listesi"?
Aylık
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.