2014-07-16 2 views
0

R에있는 "적용"유형 함수로 고민하고 있습니다. 행렬이 있고 원하는 행렬 요소를 사용하려면 사용자를 사용하십시오 행렬의 입력을 기반으로 일부 계산을 수행하고 이러한 계산의 결과를 저장할 새 계산식을 작성합니다.행렬의 각 행 요소를 사용하여 함수 적용

나는 기능이

그래서 예를 들어 행렬 A와 계산의 일종을 수행하는 기능을 가정 하나 개의 출력을 반환 할 때이 작업을 수행하는 방법을 알아 낸. I 필요한 것을

> A=matrix(1:16,nrow=4) 
> A 
    [,1] [,2] [,3] [,4] 
[1,] 1 5 9 13 
[2,] 2 6 10 14 
[3,] 3 7 11 15 
[4,] 4 8 12 16 

> B=apply(A,1,FUN=function(x) x[1]**2+2*x[2]+x[3]*x[4]) 
> B 
[1] 128 156 188 224 

는 출력이 하나 개 이상의 원소들의 벡터 인 경우,이 확장 I의 예처럼 하나가 아닌 세 개의 다른 다항식의 값을 계산하도록 예컨대 상상한다 이 3 개의 다항식의 계산을 포함 할 4x3 행렬을 다시 얻는다.

당분간 나는 행을 기준으로 데이터를 읽고, 함수를 실행하고 결과를 새로운 행렬에 저장하는 "for"루프를 사용하여이 작업을 수행하고 있지만 고통스럽게 느립니다. 예는 다음과 같습니다

A=matrix(1:16,nrow=4) 
A 
    [,1] [,2] [,3] [,4] 
[1,] 1 5 9 13 
[2,] 2 6 10 14 
[3,] 3 7 11 15 
[4,] 4 8 12 16 
calc=function(e1,e2,e3,e4){ 
    x1=e1*e2+3*e3*e4 
    x2=e4+e2+5*e3**2-e4 
    x3=e1*e2*e3*e4 
    return(c(x1,x2,x3)) 
} 

results=matrix(nrow=4,ncol=3) 

for (i in 1:4){ 
    k=calc(A[i,1],A[i,2],A[i,3],A[i,4]) 
    results[i,]=k 
} 

results 
    [,1] [,2] [,3] 
[1,] 356 410 585 
[2,] 432 506 1680 
[3,] 516 612 3465 
[4,] 608 728 6144 

나는 "를"피 매트릭스 유사한 작업을 적용 할 수있는 방법에 대한 모든 아이디어를 환영보다 더 있습니다. (나는 패키지 적용에 제약이 없다.)

+0

당신이 쉽게 apply''로 재 작성하는 방법을 알아낼 수있는 당신의'for' 루프를 포함하는 경우. – janos

+0

결과를 연장했습니다 – KGeor

답변

3

함수가 적용 프레임 워크에서 작동하지 않습니다. 함수는 개별 값이 아닌 벡터를 인수로 가져야합니다. 당신은 함수 내에서 값을 지정하면 작동합니다 :

calc=function(row){ 
    e1 = row[1]; e2 = row[2]; e3 = row[3]; e4 = row[4] 
    x1=e1*e2+3*e3*e4 
    x2=e4+e2+5*e3**2-e4 
    x3=e1*e2*e3*e4 
    return(c(x1,x2,x3)) 
} 

는 그러나 그것은 현명한이 행렬의 열을 생성합니다, 함수는 전체 행렬을 반환합니다 적용됩니다. 따라서 첫 번째 열의 결과는 첫 번째 열에 저장됩니다.이 방법은 결과의 조 변경을 통해 쉽게 해결됩니다.

t(apply(A, 1, calc)) 
+0

그것은 훌륭합니다! 많은 감사 – KGeor

0
apply(A,1,FUN=function(x){ 
    y<-rep(NA,3) 
    y[1]=x[1]+1 
    y[2]=x[2]+x[3] 
    y[3]=x[4]/2 
    return(t(y)) 
    } 
    ) 

그것은 나를 위해 일했다. 분명히 y [1], y [2], y [3]에 대한 함수를 편집하고 3 이상을 원하면 줄을 편집하십시오. y<-rep(NA,3)

2

확실하지 않음이 도움이된다면 :

fun1 <- function(mat){ 
x1 <- mat[,1]*mat[,2]+3*mat[,3]*mat[,4] 
x2 <- mat[,4]+mat[,2]+5*mat[,3]**2-mat[,4] 
x3 <- mat[,1]*mat[,2]*mat[,3]*mat[,4] 
    cbind(x1,x2,x3) 
    } 
fun1(A) 
#  x1 x2 x3 
# [1,] 356 410 585 
# [2,] 432 506 1680 
# [3,] 516 612 3465 
# [4,] 608 728 6144 
관련 문제