2017-11-10 8 views
10

Mam data.table gdzie niektóre nazwy kolumn są NA. próba zmiany ich na nazwę postaci kończy się niepowodzeniem i pozostają one NA.Błąd data.table R nie może zmienić nazwy kolumn, które są NA

Udaje mi się je zastąpić, przełączając się do data.frame, ale czy jest jakiś sposób z 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"` 

Korzystanie data.frame to działa:

setDF(dt) 
names(dt) <- c("a", "b") 
names(dt) 
# [1] "a" "b"` 

EDIT: @akrun sugeruje użycie NA_character_ ale to nie działa dla kilku NA w nazwach (co jest moja sprawa ale przykład powyżej została uproszczona)

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')) 

błąd w setnames(dt, NA_character_, c("a", "b")): niektórych pozycji old są powielane (wieloznaczne) w nazwach kolumna: NA

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

Błąd setnames(dt, c(NA_character_, NA_character_), c("a", "b")): Niektóre duplikaty istnieją 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 
> 

Odpowiedz

6

tę był błąd, niż ks w celu zidentyfikowania problemu i zapewnienia odtwarzalnego przykładu! Powinieneś być w stanie zainstalować aktualną wersję rozwojową data.table (1.10.5) z:

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

Jeśli to nie działa bezpośrednio, należy zapoznać się z Installation Wiki.

Jeśli nie możesz zainstalować tej wersji (prawa administracyjne lub można zainstalować tylko z CRAN), oto sposób obejścia: błąd pojawia się, gdy obecny jest tylko argument old z setnames (w tym przypadku jest to nieco paradoksalnie - choć myślę, że intuicyjnie w użyciu - interpretowane jako new).

Tak, aby obejść ten problem, musimy tylko mieć pewność, aby korzystać z obu old i new argumentów setnames:

setnames(dt, seq_along(dt), c('a', 'b', 'c')) 
dt 
# a b c 
# 1: 1 2 2 
# 2: 2 3 3 

Nie możemy użyć names(dt) w old argumentu, ponieważ istnieją duplikaty w names(dt), a kiedy old jest character, musimy być w stanie dopasować 1-1 nazwiska old i new (czyli robi a należą do pierwszej NA lub drugi? Ten sam problem powstaje, jeśli names(dt) był c('a', 'a', 'b') zacząć (tj. e., to oddzielny problem). Aby obejść ten problem, określamy pozycje zamiast nazw.

Powiązane problemy