2013-07-23 5 views
3

다음은 기본적으로 올바르게 생각하는 목록 구문을 이해하는 것과 관련된 간단한 r 질문입니다. 몇 가지 기본 블록 평균을 수행하고자하는 일련의 행렬을 목록에로드합니다 (일부 예비 계산에 이어). 기본 워크 플로는 다음과 같습니다.목록의 각 요소를 특정 길이로 채우기 R

1) 목록에 포함 된 각 벡터를 평균화 할 블록 수에 해당하는 정수로 반올림합니다.

2) 목록의 각 벡터를이 새 길이로 채 웁니다.

3) 목록의 각 행렬을 새로운 행렬로 변환 한 후 NA를 무시한 colmeans를 적용합니다. 내가 벡터의 목록뿐 아니라 벡터를 가지고 그러나 http://www.cookbook-r.com/Manipulating_data/Averaging_a_sequence_in_blocks/

:

이 매우 기본적인 워크 플로우는 벡터에 대해 여기에 표시된 간단한 방법을 따른다. 예를 들어 두 블록의 경우 :

test1 <- list(a=c(1,2,3,4), b=c(2,4,6,8,10), c=c(3,6)) 
# Round up the length of vector the to the nearest 2 
newlength <- lapply(test1, function(x) {ceiling(length(x)/2)*2}) 

내 문제가 있습니다. 이러한 목록 이외의 행렬이라면 나는 것 일반적으로 패드 NAS가 자신의 길이를 다음과 같이

test1[newlength] <- NA 

그러나 방법이 사용 lappy 수행하는 (또는 뭔가 akin- mapply을?). 나는 분명히 제대로 여기 구문에 대해 생각하고 있지 않다 :

lapply(test1, function(x) {x[newlength] <- NA}) 

이것은 분명히 오류를 반환

Error in x[newlength] <- NA : invalid subscript type 'list' 

을 목록에 대한 구문이 올바르지 때문이다. 그러면 어떻게해야합니까?

# Convert to a matrix with 2 rows 
test1 <- matrix(test1, nrow=2) 
# Take the means of the columns, and ignore any NA's 
colMeans(test1, na.rm=TRUE) 

내가 더 좋을 것이다 첫번째 목록 환경을 떠나지 :

은 그냥 벡터로 다음 나는 일반적으로하는 말에이 일을 완전히 나은 방법이 경우에 프로세스를 완료하기 위해? 리스트에 대한 나의 이유는 내가 큰 데이터 세트를 가지고 있고 목록을 사용하는 것이 더 우아한 접근 방법 인 것처럼 보였습니다. 나는 제안과보다 논리적 인 접근에 개방적이다. 감사.

+3

패딩의 안전한 방법은'길이 (X) <- newlength'. – Roland

답변

2

문제를 해결하는 데는 여러 가지 방법이 있지만 두 가지 중요한 개선 사항이 있다고 생각합니다. 첫 번째는 lapply()에 대한 단일 호출에서이 모든 작업을 수행하는 것입니다. 당신이 가지고있는 또 다른 주된 문제는 에러를 반환하는 호출에서 함수()의 실제 return() 값이 없다는 것입니다 (미안, 태블릿에서는 복사 및 붙여 넣기가 어렵습니다). 그래서 당신은 "x"ok를 덧붙인다.하지만 function()에게 반환 할 것을 알려주 는가? 아무것도.

lapply(test1, function(x){ 
    newlength <- ceiling(length(x)/2)*2 
    if(newlength!=length(x)){x[newlength] <- NA} 
    colMeans(matrix(x, nrow=2), na.rm=TRUE) 
}) 
+0

안녕하세요 피터, 기본적으로 감사합니다. 그러나 예제를 통해 개별 벡터가 이미 평균을 차단하려는 정수의 배수 일 때 이상한 동작을 기록합니다. 예를 들어,이 예에서 test1과 2를 넘는 블록 평균을 사용하면 test1 $ a (c (1,2,3,4))의 결과는 1.5와 3이됩니다.0 어디 내 출력 (3 + 4)/2 = 3.5 싶습니다. – user1912925

+0

좋아요, 요점을 놓 쳤어요. 요소 수가 짝수가 아니면 NAs로만 덧칠하고 싶습니다. 나는 슬레지 해머로 고정시켰다 (위 참조); 그러나 아마도 더 우아한 해결책이있을 것입니다. –

+0

우아하고 안 내 질문에 대답 해 주셔서 감사합니다. – user1912925

4

그것은 당신이 원하는 같은 소리 : 여기

내가 제대로 이해한다면 이러한 일들을 모두 수행 한 솔루션입니다

mapply(function(x,y) { 
    # x[y] <- NA # OP's proposed strategy 
    length(x) <- y # Roland's better suggestion 
    return(x) 
    }, test1, newlength) 
관련 문제