R data.table 错误无法重命名为 NA 的列名

标签 r data.table

我有一个 data.table,其中一些列名称是 NA .尝试将它们更改为字符名称失败,并且它们保持不变 NA .

不过,我设法通过切换到 data.frame 来替换它们,但是有没有办法使用 data.table ?

dt <- data.table(a = 1:2, b = 2:3)
setDF(dt)
names(dt) <- c(NA,"c")
setDT(dt)
names(dt) <- c("a","b")
names(dt)
# [1] NA  "b"`

使用 data.frame 它的工作原理:
setDF(dt)
names(dt) <- c("a", "b")
names(dt)
# [1] "a" "b"`

编辑:
@akrun 建议使用 NA_character_ 但这对名称中的几个 NA 不起作用(这是我的情况,但上面的示例已简化)
dt <- data.table(a = 1:2, b = 2:3, c = 2:3)
setDF(dt)
names(dt) <- c(NA,NA,"c")
setDT(dt)    
setnames(dt, NA_character_, c('a','b'))

Error in setnames(dt, NA_character_, c("a", "b")) : Some items of old are duplicated (ambiguous) in column names: NA


setnames(dt, c(NA_character_,NA_character_), c('a','b'))

Error in setnames(dt, c(NA_character_, NA_character_), c("a", "b")) : Some duplicates exist in old: NA



PS:
sessionInfo()

R version 3.4.2 (2017-09-28)
Platform: x86_64-suse-linux-gnu (64-bit)
Running under: SUSE Linux Enterprise Desktop 12 SP2

Matrix products: default
BLAS/LAPACK: /usr/lib64/libopenblas_serial.so.0

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C               LC_TIME=en_GB.UTF-8       
 [4] LC_COLLATE=en_GB.UTF-8     LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] rvest_0.3.2         xml2_1.1.9000       bindrcpp_0.2        shiny_1.0.5        
 [5] dplyr_0.7.3         RUnit_0.4.31        gjpoisson_0.4      
[17] gplots_3.0.1        moments_0.14        foreach_1.4.3       ggplot2_2.2.1      
[21] RODBC_1.3-15        data.table_1.10.4-3 mgcv_1.8-21         nlme_3.1-131       
[25] pacman_0.4.6        devtools_1.13.3    

loaded via a namespace (and not attached):
 [1] bitops_1.0-6        xts_0.10-0          lubridate_1.6.0     bit64_0.9-7        
 [5] httr_1.3.1          quantDb_0.4.0       RColorBrewer_1.1-2  tools_3.4.2        
 [9] backports_1.1.1     rredis_1.7.0        R6_2.2.2           
[13] KernSmooth_2.23-15  rpart_4.1-11        Hmisc_4.0-3         DBI_0.7            
[17] lazyeval_0.2.0      colorspace_1.3-2    nnet_7.3-12         withr_2.0.0        
[21] gridExtra_2.3       curl_2.8.1          bit_1.1-12          compiler_3.4.2     
[25] htmlTable_1.9       caTools_1.17.1      scales_0.5.0        dygraphs_1.1.1.4   
[29] checkmate_1.8.3     odbc_1.1.1          speedglm_0.3-2      stringr_1.2.0      
[33] digest_0.6.12       foreign_0.8-69      datashop_0.13.2     base64enc_0.1-3    
[37] pkgconfig_2.0.1     htmltools_0.3.6     htmlwidgets_0.9     rlang_0.1.2        
[41] ggthemes_3.4.0      bindr_0.1           zoo_1.8-0           gtools_3.5.0       
[45] acepack_1.4.1       inline_0.3.14       marketUtils_0.3.8   magrittr_1.5       
[49] Formula_1.2-2       Matrix_1.2-11       Rcpp_0.12.12        munsell_0.4.3      
[53] stringi_1.1.5       yaml_2.1.14         MASS_7.3-47         RJSONIO_1.3-0      
[57] plyr_1.8.4          grid_3.4.2          blob_1.1.0          gdata_2.18.0       
[61] ggrepel_0.6.5       lattice_0.20-35     splines_3.4.2       fasttime_1.0-2     
[65] hms_0.3             knitr_1.17          reshape2_1.4.2      codetools_0.2-15   
[69] fctsUtils_0.4.7     XML_3.98-1.9        glue_1.1.1          latticeExtra_0.6-28
[73] selectr_0.3-1       httpuv_1.3.5        gtable_0.2.0        purrr_0.2.4        
[77] tidyr_0.7.1         assertthat_0.2.0    mime_0.5            xtable_1.8-2       
[81] survival_2.41-3     quantum_0.13.1      tibble_1.3.4        iterators_1.0.8    
[85] memoise_1.1.0       cluster_2.0.6
> 

最佳答案

这是一个错误,感谢您发现问题并提供可重现的示例!您应该能够安装 data.table 的当前开发版本(1.10.5) 与:

install.packages('data.table', type = 'source',
                 repos = 'http://Rdatatable.github.io/data.table')

如果这不能直接工作,请咨询 Installation Wiki .

如果您无法安装此版本(管理权限或只能从 CRAN 安装),这里有一个解决方法:只有 old 时才会出现该错误。 setnames 的论据存在(在这种情况下,它有点自相矛盾——尽管我在使用中直觉上认为——解释为 new )。

所以为了解决这个问题,我们只需要确保同时使用 oldnew setnames 的参数:
setnames(dt, seq_along(dt), c('a', 'b', 'c'))
dt
#    a b c
# 1: 1 2 2
# 2: 2 3 3

我们不能用 names(dt)old参数,因为在 names(dt) 中有重复项, 当 oldcharacter ,我们需要能够匹配 1-1 oldnew名称(即 a 属于第一个 NA 还是第二个?如果 names(dt)c('a', 'a', 'b') 开始时会出现同样的问题(即,这是一个单独的问题)。为了解决这个问题,我们指定职位而不是名称。

关于R data.table 错误无法重命名为 NA 的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47228836/

相关文章:

r - 在不同的数据框中保留相同的 id

r - 在 R 中按最接近的日期连接两个数据框

r - 在 data.table 中按组删除特定时间内相同的连续值

r - 多窗口范围计算 data.table 与 dplyr

r - 使用 plyr 在两列上加入两个海量数据帧

r - 如何按顺序按组对值求和

r - 为什么在 R 中加载模型需要花费这么多时间?

r - 是否可以在 Shiny 的应用程序(renderGrViz)中选择一个graphviz节点,然后链接到其他信息?

r - 为什么在使用 data.table 分组时不能在 lapply 中使用 FUN

r - 获取 R 数据框中的位置序列