2017-11-10 22 views
10

Tôi có một data.table nơi một số tên cột là NA. cố gắng thay đổi chúng thành tên nhân vật không thành công và chúng giữ nguyên NA.R data.table lỗi không thể đổi tên cột là NA

Tôi quản lý để thay thế chúng bằng cách chuyển sang một data.frame, tuy nhiên, nhưng có cách nào với data.table không?

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"` 

Sử dụng data.frame nó hoạt động:

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

EDIT: @akrun gợi ý để sử dụng NA_character_ nhưng điều đó không làm việc trong vài NA trong tên (đó là trường hợp của tôi, nhưng ví dụ trên được đơn giản hóa)

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

Lỗi trong setnames(dt, NA_character_, c("a", "b")): Một số mặt hàng của old được nhân đôi (mơ hồ) trong tên cột: NA

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

Lỗi trong setnames(dt, c(NA_character_, NA_character_), c("a", "b")): Một số bản sao tồn tại trong 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 
> 

Trả lời

6

này là một lỗi, hơn ks để xác định vấn đề và cung cấp một ví dụ tái sản xuất! Bạn sẽ có thể cài đặt các phiên bản phát triển hiện tại của data.table (1.10.5) với:

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

Nếu điều đó không làm việc trực tiếp, xin vui lòng tham khảo Installation Wiki.

Nếu bạn không thể cài đặt phiên bản này (quyền quản trị hoặc chỉ có thể cài đặt từ CRAN), đây là giải pháp khắc phục: lỗi xuất hiện khi chỉ có đối số oldsetnames (trong trường hợp này có phần nghịch lý) mặc dù tôi nghĩ trực giác trong sử dụng - được hiểu là new).

Vì vậy, để làm được việc này, chúng ta chỉ cần hãy chắc chắn để sử dụng cả hai oldnew đối số cho setnames:

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

Chúng tôi không thể sử dụng names(dt) trong đối số old, bởi vì có bản sao ở names(dt), và khi oldcharacter, chúng tôi cần để có thể đối sánh 1-1 các tên oldnew (ví dụ: a thuộc về NA đầu tiên hoặc thứ hai? Cùng một vấn đề sẽ phát sinh nếu names(dt)c('a', 'a', 'b') để bắt đầu (i. e., đó là một vấn đề riêng biệt). Để giải quyết vấn đề này, chúng tôi chỉ định vị trí thay cho tên.

Các vấn đề liên quan