2014-03-04 4 views
0

속성 목록이 포함 된 '상황'이라는 데이터 프레임이 있습니다.속성 목록()을 R의 하위 목록에 지정

> str(situations) 
'data.frame': 24 obs. of 8 variables: 
$ ID.SITUATION   : Factor w/ 24 levels "cnf_01_be","cnf_02_ch",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ ELICITATION.D   : Factor w/ 2 levels "NATUREL","SEMI.DIRIGE": 1 1 1 1 1 1 1 1 2 2 ... 
$ INTERLOCUTEUR.C  : Factor w/ 3 levels "DIALOGUE","MONOLOGUE",..: 2 2 2 2 3 3 3 3 1 1 ... 
$ PREPARATION.D   : Factor w/ 3 levels "PREPARE","SEMI.PREPARE",..: 2 2 2 2 3 3 3 3 3 3 ... 
$ INTERACTIVITE.D  : Factor w/ 3 levels "INTERACTIF","NON. INTERACTIF",..: 2 2 2 2 1 1 1 1 3 3 ... 
$ MEDIATISATION.D  : Factor w/ 3 levels "MEDIATIQUE","NON.MEDIATIQUE",..: 2 2 2 2 2 2 2 2 2 2 ... 
$ PROFESSIONNALISATION.C: Factor w/ 1 level "PRO": 1 1 1 1 1 1 1 1 1 1 ... 
$ ID.TASK    : Factor w/ 5 levels "conference scientifique",..: 1 1 1 1 2 2 2 2 3 3 ... 

나는 내가 given corpus에서 하위 목록 것보다이 dataframes (24)의 많은 관찰이있다.

ID 상황 이름 (cnf_01_be)은 하위 목록 (cnf_01_be)의 이름과 일치합니다.

attributes(corpus$cnf_01_be) = situations[1,] 
attributes(corpus$cnf_02_ch) = situations[2,] 

그리고 특정 목적을 위해 그들에게를 검색 :

나는 할당 된 개인이 속성을 어떻게 알고

attr(corpus$cnf_01_be, "ELICITATION.D") 
attr(corpus$cnf_02_ch, "ELICITATION.D") 
attr(corpus$cnf_02_ch, "PREPARATION.D") 

하지만 어떻게 자동으로 할당 lapply 예를 들어 사용할 수 있습니다 내 코퍼스의 모든 하위 목록에 특성이 있습니까? 사전에 ...

lapply(corpus,setattr) 
lapply(corpus, attributes(corpus) <- situations[c(1:length(situations[,1])),]) 

감사를

setattr <- function(x,y) { 
    attributes(x) <- situations[y,] 
    return(attributes) 
} 

을 ... 나 : 내 모든 시험 같은 느낌

는 잘못된 방향으로 가고있다!

+0

이것은 속성 목록이 아니며 여러 변수가 포함 된 데이터 프레임입니다. '['또는'$'를 사용하여 추출하십시오. – Thomas

+0

다음과 같이 하시겠습니까?'list1 <-as.list (situations [2])'? .... 아직도 여러 하위 목록에 적용하는 방법을 아직 모르겠다. – prosodis

답변

0

lapply (및 유사한 접근법)를 사용할 때의 주된 문제점은 일반적으로 원래의 관심 객체를 변경할 수는 없지만 오히려 새로운 구조를 반환한다는 것입니다. 따라서 이미 "코퍼스"목록이 있고 그 구성원의 특성을 변경하려는 경우 일반적으로 함수 내에서이를 수행 할 수 없습니다.

이 제한을 극복하는 한 가지 방법은 일반적인 할당 대신 eval.parent() 호출을 사용하는 것입니다. 이 함수는 할당 한 객체의 로컬 인스턴스 (사본)가 아닌 상위 환경 (함수를 호출 한 환경)에서 할당 표현식을 평가합니다. 이것을 사용하면 값을 반환 할 필요가 없습니다.

또 다른 옵션은 함수 내에 코퍼스 목록의 로컬 복사본을 만들고 모든 특성을 추가 한 다음 함수에서 전체 구조를 반환하고 이전 목록을 대체하는 데 사용하는 것입니다. 목록이 크거나 복잡하면 아마도 현명한 선택이 아닙니다.

여기 코드가 있습니다. 참고 - 이것은 추한 코드입니다. 나는 더 간단하게 만들 수 있는지 여전히 찾고 있지만 위의 문제 때문에 훨씬 더 간단한 옵션이 있는지 확신하지 못합니다. 변수로

f = function(lname,data) { 
    snames = eval.parent(parse(text=paste("names(",lname,")"))) 
    for (xn in snames) { 
     rd = data[match(xn,as.character(data$id)),] 
     if (nrow(rd)>0) { 
      tmp___ <<-rd[1,] 
      cmm = paste("attributes(",lname,"[[",xn,"]]) = tmp___") 
      eval.parent(parse(text=cmm)) 
     } 
    } 

을}

참고를 위해 그것을 사용하는 당신이 문자열로 (목록의 이름을 제공해야한다는 것을, 그리고 어쨌든, 나는 다음 당신을 위해 트릭을 할 것입니다 희망) 및 데이터 프레임. 귀하의 경우 전화 번호는 다음과 같습니다.

f("corpus",situations) 

이 정보가 도움이되기를 바랍니다.

+0

감사의 뜻을 전한다. 불행히도, 당신이 짐작할 수 있듯이 내 주요 문제는이 함수를 계산하는 방법과 내 하위 목록에 그것을 적용하는 방법을 모른다는 것입니다. – prosodis

+0

나는 내 의견을 편집하고 그 일을해야하는 코드를 추가했습니다. 나는 이것이 올바르게 이해되었고 이것이 당신이하기를 원하는 바를 수행하기를 바랍니다. 그래도 추한 데. 죄송합니다 – amit

+0

우리는 성공에서 멀지는 않지만 문제가 남아있는 것 같습니다. 이름 (코퍼스)이 "cnf_01_be"에 첫 번째 객체로 답하더라도 다음과 같이 데이터를 액세스 할 수 없습니다 : corpus [[cnf_01_be]]. 나는이 'corpus $ cnf_01_be'처럼 액세스 할 수 있습니다. 물론'[]]를'$ '로 변경해도 그 트릭을 수행하지 못했습니다. 함수는 빈 문자열 또는 빈 하위 목록을 생성합니다 (lapply로 실행하면'cmm' 및'snames'를'잘라 내기 '했지만 불행하게도 아무것도 생성하지 않습니다.) 전체 코드를 거의 이해하지만 여전히 누락되었습니다. 나는 실제로이 데이터를 액세스해야한다.이 코퍼스 $ cnf_01_be [[1]]' – prosodis

관련 문제