代码之家  ›  专栏  ›  技术社区  ›  simone

数据使用spread()时复制表?

  •  0
  • simone  · 技术社区  · 7 年前

    这是一个样本 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))
    

    我使用 tydir::spread 从长格式转到宽格式

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

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

    如果我这样做,我会得到以下警告

    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() 解决这个问题的正确方法是什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Eric Fail    7 年前

    我认为使用 dcast 就是要走的路。然而,一个可能的解决方案是使用 tidyr::spread 将添加 setDT() 到管道呼叫,即。,

    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]