2017-10-26 1 views
0

다음은 샘플 data.table입니다.spread()를 사용하면 data.table이 복사됩니까?

set.seed(123) 
mydt <- data.table(id = 1:100, x = sample(LETTERS[1:6], size = 100, replace = TRUE), group = paste0("group", sample(1:3, size = 100, replace = TRUE)), prob = runif(100, 0, 1)) 

나는

mydt2 <- mydt %>% spread(group, prob) 

그럼 내가 이렇게하면

mydt2[!is.na(group1), new.col := x] 

, 나는 다음과 같은 경고 얻을에로 새 열을 정의 할 다양한 형식으로 긴에서 갈 tydir::spread를 사용

Warning message: 
In `[.data.table`(mydt2, !is.na(group1), `:=`(myscale, x)) : 
Invalid .internal.selfref detected and fixed by taking a (shallow) copy 

대신 이걸 실행하면

mydt2 <- copy(mydt %>% spread(group, prob)) 
mydt2[!is.na(group1), myscale := x] 

경고 메시지가 표시되지 않습니다. 나는이 행동을 이해하지 못한다. 누구든지 도움을 제공 할 수 있습니까? 이 문제를 해결하기 위해 copy() 올바른 방법을 사용하고 있습니까?

+0

제목은 매우 유익한되지 않을 수도 파이프로 연결된 전화에 setDT()를 추가하는 것입니다. 그렇다면 – simone

+5

'tidyr :: spread'가 내부 구조를 망가 뜨리면'data.table'이 수정되므로 (경고); 'copy' 과정에서 생성 된 새로운'data.table'은 자동적으로 정확한 내부 구조를 가지고 있습니다. 여기서 내부 구조는 열 iirc에 대해 사전 할당 된 메모리를 나타냅니다. – eddi

+0

나는이 행동에 놀랐다. 나는'gather()'가'data.table '을 돌려 준다고 생각하지 않는다. 경고를 피하기 위해'copy()'를 사용해야합니까? – simone

답변

0

나는 dcast을 사용하는 것이 좋습니다. 그러나 tidyr::spread를 사용하여 가능한 해결책은 즉,

set.seed(123) 

# install.packages(c("data.table"), dependencies = TRUE) 
library(data.table) 

mydt <- data.table(id = 1:100, x = sample(LETTERS[1:6], size = 100, replace = TRUE), 
        group = paste0("group", sample(1:3, size = 100, replace = TRUE)), 
        prob = runif(100, 0, 1) 
        ) 

class(mydt) 
mydt2 <- mydt %>% tidyr::spread(group, prob) %>% setDT() 

mydt2[!is.na(group1), new.col := x] 
관련 문제