2012-12-20 2 views
4

나는 data.tableDT을 가지고 있는데 model.matrix을 실행하고 싶습니다. 각 행의 문자열 ID는 IDDT에 저장되어 있습니다. DTmodel.matrix을 실행하면 제 수식에 ID 열이 제외됩니다. 문제는 NAs로 인해 model.matrix이 일부 행을 삭제한다는 것입니다. DT의 rownames를 ID 열로 설정하면 model.matrix을 호출하기 전에 최종 모델 행렬에 rownames가 있으며 모두 설정됩니다. 그렇지 않으면, 내가 어떤 행을 가지고 있는지 알 수 없다. 나는 rownames를 rownames(DT) = DT$ID으로 설정하고있다. 내가 DT에 새 열을 추가 할 때, 나는model.matrix 용 R의 data.table에 대한 Rownames

에 대한 불만을 얻을 "잘못된 .internal.selfref가 감지... 이전 시점에서,이 data.table은 R.에 의해 복사 된 "

그래서 나는 data.table

  • 에 대한 rownames을 설정하는 더 좋은 방법이 문제를 해결하는 더 나은 방법은
    1. 을 거기입니다 궁금하네요.
  • 답변

    10

    여기에는 몇 가지 문제가 있습니다.

    첫째, rownames이없는 data.table의 기능입니다. 대신 key이 훨씬 더 강력합니다. this great vignette을 참조하십시오.

    그러나 세상 끝은 아닙니다. 당신이

    A <- data.table(ID = 1:5, x = c(NA, 1:4), y = c(4:2,NA,3)) 
    
    mm <- model.matrix(~ x + y, A) 
    
    rownames(mm) 
    
    ## [1] "2" "3" "5" 
    

    그래서 행 2, 3, 5가 그 model.matrix에 포함되어 있습니다 예를 들어 그것을 data.table

    을 통과 model.matrix 반환 분별 rownames.

    이제이 시퀀스를 A에 대한 열로 추가 할 수 있습니다. (같은 당신이 그때 당신은 그것을 (mm의 rownames 등) 문자을 고려해 볼 수 있습니다

    A[, rowid := seq_len(nrow(A)] 
    

    뭔가 다른 (따라서 원래의 순서를 잃고)의 키를 설정할 경우에 유용 할 것이다) 그러나 그것은별로 중요하지 않습니다 당신이 참조해야 할 때 당신은 쉽게 숫자로 rownames(mm)을 변환 할 수 있습니다

    를 경고에 관해서는 당신이 다음 문장을 읽으면 data.table주는 것으로,

    키 < 피 -., 이름 <을 -을 d attr < - 현재 R에서 (이상하게) 전체 data.table을 복사 할 수 있습니다. 복사를 피하기 위해 대신 설정 * 구문을 사용 setkey에(), setnames()와 않은 setattr()를

    rownames가 속성 rownames<-입니다 같은 방법으로 (아마도 복사)합니다 (내부적으로 attr<-에 동등 사용 somepoint에서) .`row.names<-.data.frame`에서

    라인

    attr(x, "row.names") <- value 
    
    말했다되고 그건

    , data.tables이 rownames이없는, 그래서 그들을 설정 아무 소용이 없다.

    +1

    대단히 감사합니다. 지연된 후속 조치에 죄송합니다. 따라서 올바르게 이해한다면, 중요한 사실은 model.matrix가 원래의 행 번호를 행 이름으로 지정한다는 것입니다. 필요한 모든 것입니다. – DavidR