2010-04-24 2 views
2

내 프로그램에서 data.frame을 가져 와서 숫자를 크 런치합니다. 한 시점에서 j 번째 열의 값에 열 이름 (종 이름, 실제로는 생태 색인 임)에 따라 미리 정의 된 값이 곱 해집니다. 지금까지 필자는 두 번째 data.frame을 통해 이러한 값을 열 이름을 일치시켜 제공했습니다. 함수 내에서 고정 된 변수 값을 통합하는 효율적인 방법은 무엇일까요? 내 프로그램은 두 번째 data.frame 파일 없이도 가능한 한 이식성이 좋기를 바랍니다.사용자 정의 함수 내에 저장된 값

편집

이것은 함수이다. 두 번째 줄 (색인 < - read.table ...)을 개선하여 외부 소스에 종속되지 않도록하려고합니다.

macroIndex <- function(obj, index) { 
    index <- read.table("conv.csv", header=T, dec=",") 
    a <- c() 
    b <- names(obj) 
    for (i in 2:length(obj)) { 
     obj[i] <- obj[i] * index[which(index==b[i]), 2] 
    } 
    obj 
} 

나는 꽤 보이지 않을 수도 있지만,이 일을 얻는 시도 또 다른 솔루션입니다. 나는 dput (index)을 사용하여 영구 객체를 생성 한 다음 함수에 삽입합니다.

+0

내 첫번째 생각은 작은 패키지이었다. 결국, 이것이 결국 제가 끝낼 수있는 것입니다. –

+0

가장 우아한 해결책 일 수 있습니다. 인덱스 데이터 프레임을 패키지에 포함시킬 수있는 방법으로 문서화하는 것을 잊지 마십시오. – PaulHurleyuk

답변

1

음, 열 이름을 다른 값으로 매핑해야하므로 어떻게 든 저장해야합니다. 나는 결국 그것이 큰 차이를 만들지는 않더라도, 명명 된 목록이 더 적절한 데이터 구조라고 말할 것이다. 매트릭스를 사용하는 탈 권장 대하여

for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]] 

:

df <- data.frame(a=1:5, b=2:6) 
mapping <- list(a=3, b=4) 

여기서 목록을 사용하는 간단한 예이다 : 여기

일부 샘플 데이터의 즉 모든 값 것이면 참하여 데이터 프레임은 동일한 유형입니다. 유형이 다른 경우 데이터 프레임을 고수해야합니다.

+2

루프가없는 경우 :'df [,] <- lapply (names (df), function (i) df [[i]] * mapping [[i]]' – Marek

0

1) 빠른 결과를 얻으려면 data.frame 대신 매트릭스로 이동하는 것이 좋습니다.

2) 간단한 코드를 제공하여 원하는 것을 설명하십시오.

+0

내 게시물을 업데이트하고 기능을 포함 시켰습니다. 이 생태 색인을 계산하는 데 사용될 data.frames가 속도 문제를 일으킬 정도로 성장하지 않을 것으로 생각됩니다. –

1

R의 렉시 컬 범위 지정을 사용하여 원하는 함수 func을 반환하는 함수 function_maker을 정의 할 수 있습니다. 매핑 벡터를 생성하는 코드는 이 아닌 function_maker이 호출 될 때만 호출됩니다. mappingfunc의 소유이기도하므로 코드의 다른 부분에서 변경할 수 없습니다.

dat <- data.frame(a=c(1,2,3),b=c(3,2,0),c=c(5,6,4)) 

function_maker <- function(){ 
    mapping <- c(a=4,b=2,c=5) 
    function(df){ 
     for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]] 
     return(df) 
    } 
} 

func <- function_maker() 

func(dat) 
1

왜 수동으로 만들고,이 주어진 경우하지 않을 경우, 확인 후 당신이 무엇 일치하는 코드가 데이터 세트에 대해 작업 할 수 있습니다 이런 식으로 함수 호출에 매개 변수로 두 번째 데이터 프레임을 포함하지 현재이지만 새 데이터 세트와 일치하도록 변경할 수 있습니다. 같은

뭔가 (미안 해요 내 PC에 있지, 그래서이 안된) 소형 니토 어뢰 형태로이 모든 것을 통합하는 방법을

macroIndex <- function(obj, index) { 
    if(!exists(index)) { 
    index <- data.frame(# contents of the default data frame here) 
    } 
    a <- c() 
    b <- names(obj) 
    for (i in 2:length(obj)) { 
     obj[i] <- obj[i] * index[which(index==b[i]), 2] 
    } 
    return(obj) 
} 
+0

그건 제가 고려하고있는 옵션 중 하나였습니다. 내가하려고하는 일은 R에 익숙하지 않은 사람들에게 이식 할 수 있도록 가능한 한 작은 인수로 받아들이도록하는 것이다. 나는 그 것을 지금 큰 장애물로 보지 않지만 계속 유지할 것이다. 그것은 마음에 든다. –

관련 문제