Sửa một cảnh báo nhiều cột không rõ


170

Tôi có một cảnh báo nhiều lần về "cột không xác định" cho tất cả các loại lệnh (ví dụ: str (x) để cài đặt các bản cập nhật trên các gói) và không chắc chắn làm thế nào để gỡ lỗi này hoặc sửa nó.

"Cột không xác định" cảnh báo rõ ràng có liên quan đến một biến trong tbl_df mà tôi đã đổi tên, nhưng cảnh báo xuất hiện trong tất cả các loại lệnh dường như không liên quan đến tbl_df (ví dụ: cài đặt các bản cập nhật trên gói, str (x) trong đó x là chỉ đơn giản là một vectơ ký tự).


11
Tôi nhận ra câu hỏi là mơ hồ, nhưng có vẻ như vấn đề. Tôi thậm chí có thể gõ vô nghĩa (ví dụ, lỗi đánh máy) và nhận được các cảnh báo. Tôi đoán nó vẫn tồn tại trong môi trường IDE, bằng cách nào đó?
ssp3nc3r

1
Bạn có thể gửi lệnh chính xác và đầu ra bạn nhận được không?
konvas

3
Vâng, phiên bản mới nhất của RStudio. Tôi đã làm sạch môi trường, khởi động lại và nó bắt đầu xảy ra khi tôi tải vào một đối tượng TBL_DF. Tôi dường như đã khắc phục vấn đề bằng cách chuyển đổi nó thành as.data.frame, đóng mọi thứ và sau đó tải lại khung dữ liệu. Đi về phía trước, tôi muốn hiểu hai điều: làm thế nào để tránh sự cố khi sử dụng tbl_df và tại sao các cảnh báo dường như vẫn tồn tại trong môi trường.
ssp3nc3r

1
Tôi đang gặp một lỗi tương tự. Là FACEBOOK.1một cột trong một trong các data.frames của bạn và bạn có gọi nó với df$FACEBOOK.1một nơi nào đó trong tập lệnh R của bạn không? Dự đoán khiêm tốn của tôi là đây là một lỗi trong tibblegói được giới thiệu trong v1.1: blog.rstudio.org/2016/07/05/tibble-1-1 . Bạn đã tibbletải rõ ràng?
dpprdan

5
Điều này cũng đang xảy ra với tôi. Tôi có thể tái tạo mẫu trên nhiều máy tính nhưng cảnh báo dường như ngẫu nhiên sau một số lệnh, ví dụ như thư viện (Hmisc) hoặc tạo một khung dữ liệu với dplyr. Các cảnh báo đề cập đến các cột mà tôi chưa thực hiện - tôi thực hiện chúng sau này trong mã của mình. Tôi đã khởi động lại R và Rstudio nhiều lần và chạy mã sạch sẽ không giúp ích gì. Cái này là cái gì???
Nova

Câu trả lời:


57

Đây là một vấn đề với công cụ Chẩn đoán trong RStudio (công cụ hiển thị các cảnh báo và các lỗi có thể xảy ra trong mã của bạn). Nó đã được sửa một phần tại cam kết này trong RStudio v1.1.103 trở lên bởi @ kevin-ushey . Khắc phục là một phần, bởi vì các cảnh báo vẫn xuất hiện (mặc dù với tần suất ít hơn). Vấn đề này đã được báo cáo với một ví dụ có thể tái tạo tại https://github.com/rstudio/rstudio/issues/7372 và đã được khắc phục theo yêu cầu kéo RStudio v1.4 (sẽ được phát hành)

Có một số cách giải quyết có sẵn, chọn giải pháp bạn thích:

  • Vô hiệu hóa chẩn đoán mã cho tất cả các tệp trong Tùy chọn / Mã / Chẩn đoán

  • Vô hiệu hóa tất cả các chẩn đoán cho một tệp cụ thể:

    Thêm vào đầu tập tin đã mở:

     # !diagnostics off

    Sau đó lưu các tập tin và các cảnh báo sẽ ngừng xuất hiện.

  • Vô hiệu hóa chẩn đoán cho các biến gây ra cảnh báo

    Thêm vào đầu tập tin đã mở:

     # !diagnostics suppress=<comma-separated list of variables>

    Sau đó lưu các tập tin và các cảnh báo sẽ ngừng xuất hiện.

Các cảnh báo xuất hiện do công cụ chẩn đoán trong RStudio phân tích mã nguồn để phát hiện lỗi và khi thực hiện kiểm tra chẩn đoán, nó truy cập các cột trong phần mềm không được khởi tạo, đưa ra Cảnh báo mà chúng ta thấy. Các cảnh báo không xuất hiện do bạn chạy những thứ không liên quan, chúng xuất hiện khi chẩn đoán RStudio được thực thi (khi tệp được lưu, sau đó được sửa đổi, khi bạn chạy thứ gì đó ...).


13
cuộc gọi tốt Điều này làm việc với tôi trong RStudio 0.99, bỏ chọn 'hiển thị chẩn đoán cho r' trong Công cụ> Tùy chọn toàn cầu> Mã> Chẩn đoán
Chris Holbrook

8
RStudio 1.1.383 với R 3.4.3, vấn đề vẫn tồn tại.
MS Berends

4
Vấn đề vẫn tồn tại với phiên bản 1.1.423. bỏ chọn 'hiển thị chẩn đoán' hoạt động tuyệt vời
Adrian

2
Vẫn tồn tại v1.1.456. Thở dài.
địa lý

3
Sill tồn tại RStudio v1.1.643 với R v3.5.1 trên RStudio Server trên Ubuntu.
RFelber

49

Tôi đã gặp phải vấn đề tương tự, và mặc dù tôi không biết tại sao nó lại xảy ra, tôi đã có thể xác định được khi nó xảy ra, và do đó ngăn nó xảy ra.

Vấn đề dường như là với việc thêm vào một cột mới, xuất phát từ việc lập chỉ mục, trong khung dữ liệu R cơ sở so với khung dữ liệu có thể sử dụng được. Lấy ví dụ này, nơi bạn thêm một cột mới ( age) vào khung dữ liệu R cơ sở:

base_df <- data.frame(id = c(1:3), name = c("mary", "jill","steve"))

base_df$age[base_df$name == "mary"] <- 47

Điều đó làm việc mà không trả lại một cảnh báo. Nhưng khi điều tương tự được thực hiện với một cú đánh, nó sẽ đưa ra một cảnh báo (và do đó, tôi nghĩ rằng gây ra vấn đề kỳ lạ, dường như không được cung cấp, nhiều cảnh báo):

library(tibble)

tibble_df <- tibble(id = c(1:3), name = c("mary", "jill","steve"))

tibble_df$age[tibble_df$name == "mary"] <- 47

Warning message:
Unknown column 'age' 

Chắc chắn có nhiều cách tốt hơn để tránh điều này, nhưng tôi đã thấy rằng trước tiên việc tạo ra một vectơ NAs thực hiện công việc:

tibble_df$age <- NA

tibble_df$age[tibble_df$name == "mary"] <- 47

13
Câu trả lời của tôi rõ ràng không phải là toàn bộ câu chuyện: Tôi vẫn nhận được (nhiều) cảnh báo và như các nhà bình luận khác đã ám chỉ, phần bực bội là sự độc đoán rõ ràng của nó. Một điều tbl_dfdường như là cần thiết để đưa ra các cảnh báo, nhưng tôi không chắc rằng nó là đủ. Đó là, tôi nghĩ rằng cảnh báo này có thể xuất hiện khi tbl_dfs được sử dụng cùng với các chức năng từ các gói tidyverse khác (ví dụ: tidyr, dplyr). Giá nhỏ để trả cho một bộ gói quan trọng như vậy, nhưng dù sao cũng lạ / khó chịu.
hoại

Tạo một vectơ của NAs làm việc cho tôi! (Phiên bản RStudio 1.1.456, phiên bản R 3.5.1)
petzi

Đôi khi tôi muốn chỉ định loại cột, ví dụ: Ngày R và nếu tôi điền vào NA, ngày được điền sau sẽ được chuyển đổi thành loại số.
Jiāgěng

1
@ Jiāgěng as.Date(NA_character_)đưa ra NAvới lớp Date.
Stibu

Các thiết bị được thiết kế hạn chế hơn data.frames. Có thể là do thiết kế, bạn không cần phải bắt đầu một cột bằng cách chỉ gán một phần cho nó. Tuy nhiên, nếu đây là một tính năng bảo vệ và không phải là lỗi thiết kế, thì lỗi một lần sớm trong việc gán tốc độ sẽ được ưu tiên hơn nhiều.
vinnief

17

Tôi đã phải đối mặt với vấn đề này khi sử dụng gói "dplyr".
Đối với những người gặp phải vấn đề này sau khi sử dụng chức năng "group_by" trong thư viện "dplyr":

Tôi đã thấy rằng việc bỏ các biến giải quyết vấn đề cảnh báo cột không xác định. Đôi khi tôi đã phải lặp đi lặp lại nhiều lần cho đến khi vấn đề được giải quyết.


4

Chuyển đổi lớp thành data.framegiải quyết vấn đề cho tôi:

library(dplyr)
df <- data.frame(id = c(1,1:3), name = c("mary", "jo", "jill","steve"))
dfTbl <- df %>%
  group_by(id) %>%
  summarize (n = n())
class(dfTbl) # [1] "tbl_df"     "tbl"        "data.frame"
dfTbl = as.data.frame(dfTbl)
class(dfTbl) # [1] "data.frame"

Mượn đoạn script một phần từ @adts


Nó hoạt động như một say mê. Tôi đã tự hỏi là có bất kỳ nhược điểm nào để chuyển đổi nó thành một khung dữ liệu và sau đó chuyển đổi nó trở lại thành tibble. Có phải chỉ có những cảnh báo rằng nó mất?
p130ter

1
Không hoạt động đối với tôi RStudio 1.1.442 vẫn nhận đượcWarning message: Unknown or uninitialised column: 'bad_column'
andemexoax

3

Tôi đã có vấn đề này khi xử lý các chức năng nhanh nhẹn và lapply với nhau. Các tibble dường như lưu mọi thứ như một danh sách bên trong khung dữ liệu.

Tôi đã giải quyết nó bằng cách sử dụng unlist trước khi thêm kết quả của hàm lapply vào tibble.


1

Tôi cũng gặp phải vấn đề này ngoại trừ thông qua một thao tác được tạo bằng cách sử dụng khối dyplyr. Đây là một sửa đổi nhỏ về mã của sabre để cho thấy tôi đã gặp phải lỗi tương tự như thế nào.

library(dplyr)

df <- data.frame(id = c(1,1:3), name = c("mary", "jo", "jill","steve"))

t <- df %>%
  group_by(id) %>%
  summarize (n = n())

t
str(t)


t$newvar[t$id==1] <- 0

1

Giả sử tôi muốn chọn (các) cột sau

best.columns = 'id'

Đối với tôi sau đây đã đưa ra cảnh báo:

df%>% select_(one_of(best.columns))

Mặc dù điều này hoạt động như mong đợi, mặc dù, theo như tôi biết dplyr, điều này nên giống hệt nhau.

df%>% select_(.dots = best.columns)

0

Tôi nhận được các cảnh báo này khi tôi đổi tên một cột bằng dplyr::renamecách sử dụng readrgói đó.

Tên cũ của cột không được đổi tên trong specthuộc tính. Vì vậy, loại bỏ các specthuộc tính làm cho các cảnh báo biến mất. Ngoài ra, loại bỏ lớp "spec_tbl_df" có vẻ là một ý tưởng tốt.

attr(dat, "spec") <- NULL
class(dat) <- setdiff(class(dat), "spec_tbl_df")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.