R data.frame странное поведение при преобразовании символов в числовые - PullRequest
1 голос
/ 29 сентября 2019

Я имею дело с набором данных, содержащим коды FIPS штатов США, закодированные в виде символов, где коды от 1 до 9 иногда имеют префикс 0 (01, 02, ...).При попытке очистить его я столкнулся со следующей проблемой:

test <- data.frame(fips = c(1,"01")) %>%
mutate(fips = as.numeric(fips))

> test
  fips
1    2
2    1

, где 1 преобразуется как 2, а 01 как 1. Это раздражающее поведение исчезает с тибблом:

test <- tibble(fips = c(1,"01")) %>%
        mutate(fips = as.numeric(fips))
> test
# A tibble: 2 x 1
   fips
  <dbl>
1     1
2     1

Кто-нибудь знает, что происходит?Спасибо

1 Ответ

5 голосов
/ 29 сентября 2019

Это разница по умолчанию для элементов tibbles и data.frames.Когда вы смешиваете строки и числа, как в c (1, "01"), R преобразует все в строку.

c(1, "01")
[1] "1"  "01"

Поведение по умолчанию для data.frame состоит в преобразовании строк в факторы.Если вы посмотрите на страницу справки для data.frame, то увидите аргумент:

stringsAsFactors: ... Заводское значение по умолчанию - TRUE

.фрейм данных превращает c (1, "01") в фактор с двумя уровнями "1" и "01"

T1 = data.frame(fips = c(1,"01")) 
str(T1)
'data.frame':   2 obs. of  1 variable:
 $ fips: Factor w/ 2 levels "01","1": 2 1

Теперь коэффициенты сохраняются как целые числа для эффективности.Вот почему вы видите 21 в конце вывода о str (T1).Поэтому, если вы непосредственно преобразуете это в целое число, вы получите 2 и 1.

Вы можете получить желаемое поведение, либо сделав data.frame более осторожным с помощью

T1 = data.frame(fips = c(1,"01"), stringsAsFactors=FALSE)

или Вы можете преобразовать коэффициент в строку перед преобразованием в число.

fips = as.numeric(as.character(fips))

В столбцах нет этой проблемы, поскольку они не преобразуют строки в факторы.

...