즉시 변수 이름을 지정하는 방법은 무엇입니까?


96

즉석에서 새 변수 이름을 만들 수 있습니까?

목록의 데이터 프레임을 끝에 숫자가있는 새 변수로 읽고 싶습니다. orca1, orca2, orca3 ...

내가 뭔가를 시도하면

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

이 오류가 발생합니다.

target of assignment expands to non-language object

이것에 대한 다른 방법이 있습니까?


10
r-faq 태그를 제공하는 한 링크를 제공하겠습니다 (FAQ 7.21 : cran.r-project.org/doc/FAQ/… )
Ben Bolker

답변:


118

사용 assign:

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

28
이것이 방법입니다. 여기에 "내가 이것을해야합니까?"라는 메타 질문이 있습니다. 대답은 거의 항상 "아니오"입니다. 목록에서 명명 된 요소는 거의 항상 선호됩니다.
Ari B. Friedman 2012

26
대답은 그렇지 않은 경우를 제외하고 거의 항상 "아니오"입니다.
Shane

9
물론입니다. 그러나이 답변을 찾는 대부분의 사람들은 신청 목록을 거부 한 입장에서 그렇게하지 않습니다.
Ari B. Friedman 2012 년

@Ari B. Friedman mypackage / data에 저장 한 데이터 세트에 대한 변수 이름을 생성합니다. 파일과 그 안의 데이터에 대해 동일한 이름을 가진 파일의 각 파일 (패키지의 데이터에 대한 R 권장 사항 제공). 각 데이터 세트는 약 10M이고 합계는 ~ 17Go입니다.
cmbarbu

3
사용하지 않은 이유가 있나요 paste0?
BroVic

33

그것은 당신이 목록이 더 나을 것이 아니라 사용하고있는 나에게 것 orca1, orca2등 ... 그때는 것 orca[1], orca[2]...

일반적으로 숫자로만 구분되는 변수 목록을 만듭니다. 그 숫자는 나중에 쉽게 액세스 할 수있는 방법이기 때문입니다.

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

그렇지 않으면 assign당신이 원하는 것입니다.


11
나는 동의한다. 일반적으로 사람들이 즉시 변수 이름을 지정하고 싶다고 생각할 때 실제로 원하는 것은 다른 데이터 구조입니다.
Michael Dunn

9
+1 (FAQ 7.21 : cran.r-project.org/doc/FAQ/...는 ) 잘이에 대해 설명
벤 Bolker

11

데이터 프레임을 만들지 마십시오. 목록을 유지하고 요소의 이름을 지정하되 첨부하지 마십시오.

가장 큰 이유는 이동 중에 변수를 만들면 거의 항상 나중에 유용한 작업을 수행하기 위해 각 변수를 반복해야하기 때문입니다. 거기에서 당신은 즉석에서 생성 한 각각의 이름을 반복해야합니다.

목록의 요소에 이름을 지정하고 이름을 반복하는 것이 훨씬 쉽습니다.

어 태치에 관한 한, R에서의 정말 나쁜 프로그래밍 관행이며 조심하지 않으면 많은 문제를 일으킬 수 있습니다.


그렇다면 첨부를 수행하지만 목록을 반복 한 후에야?
Mox

4

FAQ 내용 :

당신이 가지고 있다면

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

넌 할 수있어

get(varname[1]) + 2

...에 대한

a + 2

또는

assign(varname[1], 2 + 2)

...에 대한

a <- 2 + 2

따라서 변수 (예 : 연결)를 사용하는 수식을 평가하려는 경우 GET을 사용하고 미리 선언 된 변수에 값을 할당하려는 경우 ASSIGN을 사용하는 것처럼 보입니다.

assign 구문 : assign (x, value)

x : 문자열로 주어진 변수 이름. 강제 변환이 수행되지 않으며 길이가 1보다 큰 문자형 벡터의 첫 번째 요소가 경고와 함께 사용됩니다.

value : x에 할당 할 값.


0

또 다른 까다로운 해결책은 목록의 요소에 이름을 지정 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
까다 롭지 만 현명하지는 않습니다. 대답은 경우 attach는 일반적으로 ... 잘못된 질문을하고
벤 Bolker을

-1

그리고이 옵션은?

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

완벽하게 작동합니다. 입력 한 예에서 첫 번째 줄이 누락 된 다음 오류 메시지가 표시됩니다.


3
이것은 OP의 질문을 다루지 않습니다. 우리는 dataframes와 목록을 가지고, 우리는 등 orca1, orca2,로 명명 dataframes,에 할당 할
zx8754

"List with dataframes"= "list OF dataframes"?
Mox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.