我正在处理一个包含以字符编码的美国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
有人知道发生了什么吗?谢谢
这是小标题和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))
小标题不存在此问题,因为它们不会将字符串转换为因数。