Почему числа иногда рассматриваются как символы в R? - PullRequest
0 голосов
/ 11 мая 2019

Я создал набор данных панели путем компиляции данных из нескольких источников. Но почему переменные, то есть local_aus, hyv_aus и hyv_aman, рассматриваются как символы, а не числа? Я использовал: mutate(local_aus = as.numeric(local_aus), hyv_aus = as.numeric(hyv_aus), hyv_aman = as.numeric(hyv_aman))

Однако, R показывает, warning messages: NAs introduced by coercion. Но почему эти числовые значения считаются символами?

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   856 obs. of  24 variables:
 $ district             : num  11704 10408 11921 12007 11313 ...
 $ year                 : num  1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
 $ local_aus            : chr  "178145" "94390" "119375" "56375" ...
 $ hyv_aus              : chr  "3010" "850" "2095" "3785" ...
 $ broadcast_aman       : num  70325 9435 33340 1495 316580 ...
 $ local_transplant_aman: num  673060 270550 282655 35825 188655 ...
 $ hyv_aman             : chr  "3185" "920" "3080" "820" ...
 $ local_boro           : num  6450 12050 41430 14450 45970 ...
 $ hyv_boro             : num  67930 10630 121340 15640 116500 ...
 $ danger_days_aus      : num  0 0 142 4 108 434 5 36 33 1 ...
 $ benefit_days_aus     : num  0 0 9 0 21 110 0 0 0 0 ...
 $ danger_days_aman     : num  0 0 32 0 43 218 0 0 29 2 ...
 $ benefit_days_aman    : num  0 0 89 0 110 426 3 52 53 2 ...
 $ danger_days_boro     : num  0 0 1 0 0 0 0 0 0 0 ...
 $ benefit_days_boro    : num  0 0 0 0 0 0 0 0 0 0 ...
 $ abovemax_aus         : num  2 25 1 37 4 18 29 19 45 42 ...
 $ belowmin_aus         : num  1 1 2 4 2 0 3 3 2 0 ...
 $ abovemax_aman        : num  0 0 0 0 1 0 2 1 1 6 ...
 $ belowmin_aman        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ abovemax_boro        : num  2 7 0 10 1 8 4 7 5 12 ...
 $ belowmin_boro        : num  116 123 107 92 76 115 138 125 124 89 ...
 $ rain_aus             : num  5969 1088 6902 5637 3831 ...
 $ rain_aman            : num  5477 650 5806 2291 2900 ...
 $ rain_boro            : num  601.6 38.1 1067.3 381 387.4 ...

1 Ответ

0 голосов
/ 11 мая 2019

Как уже упоминали другие, у вас, скорее всего, есть нерегулярные NA с среди ваших числовых значений.Также возможно, что вы импортировали CSV, используя неправильный десятичный формат.Посмотрите на строки 3-5 в столбце local_aus.Значения -, 563,75 и none приведут к тому, что R приведет столбец к классу "символ":

# A tibble: 5 x 2
   year local_aus
  <int> <chr>    
1  1970 178145   
2  1970 94390    
3  1970 -        
4  1970 563,75   
5  1970 none     

Если вы запустите as.numeric(df$local_aus), вы получите то же предупреждениеВы описываете выше.Вы можете использовать регулярные выражения, чтобы найти проблемные значения (предполагая, что значения должны быть целыми числами):

> df$local_aus[!grepl("^\\d+$", df$local_aus)]
[1] "-"      "563,75" "none" 

Лучше всего решать эти проблемы при вызове read.* или readr::read_*.Вот два примера, которые будут правильно импортировать приведенный выше пример данных:

# using base R
df <- read.table("example.txt",
                 header = T,
                 stringsAsFactors = F,
                 dec = ",",
                 na.strings = c("-", "none")
                 )

# using readr library
df <- readr::read_table("example.txt",
                        locale = locale(decimal_mark = ","),
                        na = c("-", "none")
                        )

#### OUTPUT ####

df

# A tibble: 5 x 2
   year local_aus
  <dbl>     <dbl>
1  1970   178145 
2  1970    94390 
3  1970       NA 
4  1970      564.
5  1970       NA 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...