2014-11-08 5 views
1

저는 R이 처음인데 기본 개념에 익숙해지면서 시간을 보내고 나서 첫 번째 함수를 작성하려고합니다. 이 함수를 사용하여 데이터 프레임 목록에 대한 간단한 계산을하고 싶습니다. 내 데이터는 다음과 같이 (I 100 개 이상의 dataframes을 가지고, 그래서 이것은 단순화) 외모 : 내가 원하는 무엇R : 데이터 프레임 목록에 함수를 적용 할 때 오류가 발생했습니다.

d1 <- data.frame(bp1=c(1,2,3),bp2=c(4,5,6), lp=c(4,5,6)) 
d2 <- data.frame(bp1=c(3,2,1),bp2=c(6,5,4), lp=c(2,1,6)) 
my.list <- list(d1, d2) 

은 10^-1 열을 받아 3 열에서 값을 곱하는 것입니다. 그런 다음 첫 번째 열을 기준으로 결과를 집계합니다. 내 기능은 다음과 같습니다

bp_calc <- function(x) { 
bp1 <- x[[i]][1] 
lp <- x[[i]][3] 
10^-lp * lp -> x[[i]]$p_logp 
aggregate(x[[i]]$p_logp ~ bp1, data = x, sum) -> result 
return(result) 
} 

내 데이터 기능을 사용하려면, 내가 사용 :

lapply(my.list,bp_calc) 

그러나,이 오류를 던지고있다 : 오류 .subset2에 (X, I, 정확한 = 정확한) : 범위 밖의 첨자. 나는 물론이 포럼에 google과 seaching을 시도했지만, 내가 뭘 잘못하고 있는지 이해할 수는 없다. 도와 주시면 감사하겠습니다.

+1

어디'놀이에 와서 i' 않습니다

은 당신이 원하는 것은 이것이다. 최소한 bp1 <- x [[i]] [1];을 바꿔서 실행할 수 있습니다. lp <- x [[i]] [3]'~'bp1 <- x [, 1]; lp <- x [, 3]'그리고 다른 [[i]]를 제거하십시오 – rawr

+0

@rawr에게 고마워요! 그것은 아주 잘 작동합니다! – lpoulsen

답변

1

당신은 새로운 변수 p_logp을 만들 transform를 사용 aggregate

bp_calc <- function(x) { 
    aggregate(p_logp~bp1, transform(x, p_logp=10^-lp*lp), sum) 
} 

lapply(my.list, bp_calc) 
+0

감사합니다. $ akrun! 그것은 훨씬 더 간단한 방법 (최소한 코드가 적음)처럼 보입니다. 그러나 변환을 실제로 이해하지 못하므로이 코드를 사용하는 것을 주저합니다. "transform은 제네릭 함수입니다. 적어도 현재는 데이터 프레임에 유용한 모든 것을 수행합니다. transform.default는 가능하면 첫 번째 인수를 데이터 프레임으로 변환하고 transform.data를 호출합니다. 프레임 "... 이것은 정말 도움이되지 못했지만 어쩌면 당신은 더 나은 설명을 할 수 있을까요? – lpoulsen

+0

@lpoulsen 새로운 변수'p_logp'를 데이터 프레임'x' 내부에 만들고 있는데,'x'는'my.list'의리스트 요소입니다. 변환이 무엇인지 확인하는 한 가지 방법은 해당 인수를 분리하여 별도로 실행하는 것입니다. 'lapply (my.list, function (x) transform (x, p_log = 10^-lp * lp))'. 귀하의 예를 들어, 당신은 데이터 프레임의 목록에서 새 변수를 작성했다. – akrun

+0

@lpoulsen'transform'은 data.frame을 반환합니다. 그래서 그가하고있는 일은 실제로 다음과 같습니다 :'x_transformed <- transform (x, p_logp = 10^-lp * lp); 집계 (p_logp ~ bp1, x_transformed, sum)' – shadowtalker

0

subscript out of boundsdata로 사용할 수는 존재하지 않는 목록 요소에 액세스하기 위해 노력하고 있다는 것을 의미한다. 예 :

l <- as.list(letters[1:3]) 
l[4] # returns list(NULL) 
l[[4]] # error 

그렇다면 왜 이런 일이 발생합니까? 코드를주의 깊게보십시오. lapply(my.list, bp_calc)my.list의 각 요소를 추출하여 bp_calc의 첫 번째 인수로 전달합니다. 이 경우 각 목록 요소는 데이터 프레임이며 i은이 프로세스의 어느 곳에도 정의되지 않습니다.

따라서 R은 bp_calc이 정의 된 환경에서 i이라는 변수를 검색합니다. 이 경우 i을 찾거나 그렇지 않으면 오류가 반환됩니다. 여기서 R은 다른 곳에서 정의 된 i을 찾습니다. 그렇지 않으면 object 'i' not found이 될 수 있기 때문입니다. 그리고 i이 무엇이든간에 그것은 분명히 1, 2, 3, bp1, bp2 또는 lp 중 하나가 아닙니다.

당신이 여기 할 필요하면 함수 내에서 i를 정의하거나 (즉,이 같은 버그가 첫 번째 장소에서 발생하는 방법이기 때문에 권장하지 않음) 세계를 정의하거나 (명시 적 인수로에 전달하는 중입니다) 추천 :

bp_calc <- function(x, i) { 
    # stuff 
} 
lapply(my.list, bp_calc, i = something) 

그리고 무엇 R은 i와 함께 일을하려고합니까? 요소 ix에 액세스하려고 시도한 다음 요소 1 또는 3x[[i]]에 액세스하려고합니다. 떨어져 my.listbp_calc 이전 lapply 휴식이 호출되기 때문에, x하나의 데이터 프레임이 아닌 데이터 프레임의 목록입니다 기억하십시오.x[[i]]이 "현재"목록 요소에 액세스한다고 생각하는 것 같지만 실제로는 x이 현재 목록 요소이므로 x[[i]]은 실제로 "my.list의 현재 요소의 i 번째 요소입니다." 따라서 x[[i]][3]은 "my.list의 현재 요소의 i 번째 요소 중 세 번째 요소"입니다.

bp_calc <- function(x) { 
    bp1 <- x[[1]] 
    lp <- x[[3]] 
    10^-lp * lp -> x$p_logp 
    aggregate(x$p_logp ~ bp1, data = x, sum) 
    # by the way, R functions automatically return the last evaluated expression 
} 
+0

감사합니다. $ ssdecontrol에 대한 자세한 설명이 멋졌습니다! 내가 틀렸다면 정정하십시오. 그러나 이것은 목록에서 각 기능을 사용하고자하는 각 데이터 프레임에 'i'를 정의해야 함을 의미합니까? 예 : my.list의 데이터 프레임 1과 2에 대해 : bp_calc <- function (x, i) { # stuff } lapply (my.list, bp_calc, i = 1 : 2) – lpoulsen

+0

아니요, 너는'i '와 함께하려고했다. 잠시 후에 편집을하겠습니다. – shadowtalker

관련 문제