2013-04-11 2 views
-1

는 내가 가진 :가치 할당을 위해 문자 벡터를 R의 숫자 벡터로 변환 하시겠습니까?

z = data.frame(x1=a, x2=b, x3=c, etc) 

내가 할 노력하고 있어요 :

for (i in 1:10) 
{ 
    paste(c('N'),i,sep="") -> paste(c('z$x'),i,sep="") 
} 

문제 :

  1. paste(c('z$x'),i,sep="") 수익률 대신 실제 값을 호출 "z$x1", "z$x1"을. 평가할 표현식이 필요합니다. 나는 as.numeric, eval을 시도했다. 어느 쪽도 효과가없는 것 같았다.

  2. paste(c('N'),i,sep="") 수율 "N1", "N2". 표현식을 단순히 이름으로 사용해야합니다. paste(c('N'),5,sep="") -> 5과 같은 값을 할당하려고하면 N5 -> 5 대신 "N5" -> 5 대신 할당 대상이 비 언어 대상으로 확장됩니다.

이 작업은 단순히 할 수 있기 때문에 매우 간단하다 : 등

N1 = 1 개 ... N2 = 2 배 ...

을, 그러나 나는 새로운 것을 배우고 싶은

+1

'get'과'assign'을 사용합니다. 그러나 그렇게하지 마십시오 - 대신 목록을 사용하십시오. 이것에 대한 R FAQ뿐만 아니라 많은 SO 질문들 (당신이 옳은 것을 찾을 수있게 됨)이 있습니다. –

답변

2

내가 for(i in 1:10) z[,i] <- N[,i] 같은 것을 사용하는 것이 좋습니다 것 ...

하지만.

참고 :이 작은 도구는 재밌지 만 숙련 된 사용자 (나이 아니라)는이를 피할 수 있습니다.

이것은 "언어에 대한 컴퓨팅"이라고합니다. 매우 흥미롭고 R이 작동하는 방식을 이해하는 데 도움이됩니다. 소개해 드리겠습니다.

기본 언어 구문은 숫자 또는 문자 벡터와 같은 상수입니다. 그것의 "평가되지 않은"버전과 다르지 않기 때문에 그것은 사소한 것이지만, 더 복잡한 표현을위한 빌딩 블록 중 하나입니다.

(공식적으로) 기본 언어 개체는 symbol이며 name이라고도합니다. 그것은 다른 객체에 대한 포인터 일뿐입니다. 즉, 존재하지 않을 수도있는 다른 객체를 식별하는 토큰입니다. 예를 들어, x <- 10을 실행하면 은 10을 나타내는 기호입니다. 즉, 기호 x을 계산하면 숫자 벡터 10이 산출됩니다. 존재하지 않는 기호를 평가하면 오류가 발생합니다.

기호는 문자열처럼 보이지만 그렇지 않습니다. 문자열을 as.symbol("x")으로 기호로 바꿀 수 있습니다.

다음 언어 개체는 call입니다. 이것은 재귀 객체이며, 요소가 상수, 기호 또는 다른 호출 인 list으로 구현됩니다.첫 번째 요소는 이 아니고이되어야합니다.이 요소는 호출 될 실제 function으로 평가되어야하기 때문에 상수 여야합니다. 다른 요소는이 함수에 대한 인수입니다.

첫 번째 인수가 기존 함수로 평가되지 않으면 R은 Error: attempt to apply non-function 또는 Error: could not find function "x" (첫 번째 인수가 정의되지 않은 기호이거나 함수가 아닌 다른 요소를 가리키는 경우) 중 하나를 반환합니다.

예 : f(x, y+z, 2) 4 개 요소들의리스트로서 해석 될 코드 라인, 제 인 f (기호 등), 제 인 x (다른 기호), 다른 call 세 번째 및 네 번째 숫자 상수 . 세 번째 요소 인 y+z은 두 개의 인수가있는 함수이며 따라서 '+', yz의 세 가지 이름 목록으로 구문 분석합니다.

마지막으로 호출/기호/상수의 목록 인 expression 개체도 하나씩 차례로 평가됩니다.

당신은 여기에 많은 정보를 찾을 수 있습니다 :

https://github.com/hadley/devtools/wiki/Computing-on-the-language

확인을 지금의 당신이 시도 무엇

이 작동하지 않습니다 :-) 다시 질문하자 때문에 paste의 출력 는 문자열이고, 대입 함수는 첫 번째 인수로 심볼로 평가되는 무언가가 생성되거나 수정 될 것으로 기대합니다. 또한 첫 번째 인수는 대체 함수와 연결된 호출로 평가할 수 있습니다. 이들은 조금 까다 롭지 만 파서가 아닌 할당 함수 자체에서 처리합니다.

표시되는 오류 메시지는 target of assignment expands to non-language object이며 대상이 문자열로 평가되기 때문에 할당 기능에 의해 트리거됩니다.

올바른 위치에 원하는 기호가 포함 된 전화를 걸 수 있습니다.

substitute(x -> y, list(x=as.symbol(paste("N",i,sep="")), y=substitute(z$w, list(w=paste("x",i,sep=""))))) 

내부 대신이 callz$x1 작성

parse(text=paste('N',i," -> ",'z$x',i,sep="")) 

substitute를 사용하는이 얻을 수있는 또 다른 방법 : 가장 "무력"방법은 문자열과 사용 구문 분석 안에 모든 것을 넣어하는 것입니다 z$x2 등입니다. 외부 대체자는이 호출을 할당의 태그 세트로 사용하고 기호로는 N1, N2 등을 값으로 사용합니다.

parseexpression이고, substitutecall이된다. 두 결과 모두 동일한 결과를 얻으려면 eval으로 전달할 수 있습니다.

그냥 하나의 마지막 노트 : 나는 모든이가 언어의 내부 동작을 이해하기 위해, 교훈적인 예로서 구성되는 것을 반복하지만, 지금까지 좋은 프로그래밍 연습에서이 경우를 제외하고 parsesubstitute를 사용하는 입니다 은 정말로 대안이 없습니다.

1

나는 당신이 성취하려는 것을 정확히 모르겠습니다. 그러나 여기 추측이다 : 당신이, 당신이 parsesubstitute 함께 놀러 할 수있는 새로운 무언가를 배우고 싶어했다 이후

### Create a data.frame using the alphabet 
data <- data.frame(x = 'a', y = 'b', z = 'c') 

### Create a numerical index corresponding to the letter position in the alphabet 
index <- which(tolower(letters[1:26]) == data[1, ]) 

### Use an 'lapply' to apply a function to every element in 'index'; creates a list 
val <- lapply(index, function(x) { 
    paste('N', x, sep = '') 
}) 

### Assign names to our list 
names(val) <- names(data) 

### Observe the result 
val$x 
2

data.framenamed list입니다. 그것은 일반적으로 좋은 연습 및 관용구 R-ish은 글로벌 환경에서 개체를 많이 가지고,하지만 관련이있다 (또는 유사) 목록에 개체 및 사용하지 lapply

당신의 이름 요소를 multiassign하는 list2env를 사용할 수 있습니다 귀하의 목록 (귀하의 data.frame의 열)이 지구 환경에

DD <- data.frame(x = 1:3, y = letters[1:3], z = 3:1) 
list2env(DD, envir = parent.frame()) 
## <environment: R_GlobalEnv> 
## ta da, x, y and z now exist within the global environment 
x 
## [1] 1 2 3 
y 
## [1] a b c 
## Levels: a b c 
z 
## [1] 3 2 1 
관련 문제