R字符转换为数字时的data.frame奇怪行为

问题描述 投票:1回答:1

我正在处理一个包含以字符编码的美国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

有人知道发生了什么吗?谢谢

r dataframe dplyr tibble
1个回答
5
投票

这是小标题和data.frames默认值的不同。当像c(1,“ 01”)一样将字符串和数字混合在一起时,R会将所有内容转换为字符串。

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

data.frame的默认行为是将字符串变成因子。如果查看data.frame的帮助页面,则会看到参数:

stringsAsFactors:...'factory-fresh'默认为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

现在将系数存储为整数以提高效率。这就是为什么在str(T1)的about输出的末尾看到2 1的原因。因此,如果直接将其转换为整数,则得到2和1。

[您可以通过使用]更仔细地使data.frame来获得所需的行为。

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

您可以在转换为数字之前将因子转换为字符串
fips = as.numeric(as.character(fips))

小标题不存在此问题,因为它们不会将字符串转换为因数。

© www.soinside.com 2019 - 2024. All rights reserved.