R:为什么as.character会将int矩阵转换为char,但as.integer不会将char矩阵转换为int?

Phi*_*etz 0 r type-conversion

"as.X"运算符通常将一种类型转换为另一种类型,但as.integer在应用于数组时失败.这是一个错误吗?这是Microsoft R Open版本3.3 64位,也是R Foundation的R 3.3.1 for i686-pc-cygwin(32位).

> m <- matrix(rnorm(25), 5)
> m
           [,1]       [,2]       [,3]       [,4]       [,5]
[1,] -0.5958330 -0.3139274 -0.4746246  0.2431716 -0.5245235
[2,]  0.5677058  0.1944457 -2.3786936  0.2516587 -0.3541963
[3,]  0.6763564 -1.7285476 -0.5878008 -1.2277048  0.7737145
[4,] -1.4607755 -0.4761012  1.0995414  0.6978072  0.6120277
[5,]  0.8593707  0.2962030  1.1791963 -0.2276658  1.1559314
> m[] <- as.integer(m)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0   -2    0    0
[3,]    0   -1    0   -1    0
[4,]   -1    0    1    0    0
[5,]    0    0    1    0    1
> m[] <- as.character(m)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,] "0"  "0"  "0"  "0"  "0" 
[2,] "0"  "0"  "-2" "0"  "0" 
[3,] "0"  "-1" "0"  "-1" "0" 
[4,] "-1" "0"  "1"  "0"  "0" 
[5,] "0"  "0"  "1"  "0"  "1" 
> m[] <- as.integer(m)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,] "0"  "0"  "0"  "0"  "0" 
[2,] "0"  "0"  "-2" "0"  "0" 
[3,] "0"  "-1" "0"  "-1" "0" 
[4,] "-1" "0"  "1"  "0"  "0" 
[5,] "0"  "0"  "1"  "0"  "1" 
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 6

文件说明:

当索引表达式出现在赋值的左侧(称为子分配)时,x的该部分将设置为赋值右侧的值.在这种情况下,不进行字符索引的部分匹配,并且根据需要强制左侧接受值.对于向量,答案将是层次结构raw <logical <integer <double <complex <character <list <expression中x和类型中较高的类型.

您在左侧看到的子分配行为与记录的行为一致.

请注意,即使as.integer直接应用于双矩阵在这种情况下"有效",它仍然遵循类型层次结构并且仅循环:

> m <- matrix(rnorm(25), 5)
> str(m)
 num [1:5, 1:5] 1.3807 -0.0858 1.4478 0.9509 0.6397 ...
> typeof(m)
[1] "double"
> m[] <- as.integer(m)
> str(m)
 num [1:5, 1:5] 1 0 1 0 0 0 0 0 -1 -1 ...
> typeof(m)
[1] "double"
Run Code Online (Sandbox Code Playgroud)

最后,as.integer通常不会将字符转换为有效整数:

> str(as.integer("a"))
 int NA
Warning message:
In str(as.integer("a")) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)

...除了它导致整数味道NA,即NA_integer_.但只要没有子分配,它就会将字符转换为整数:

> str(as.integer("1"))
 int 1
Run Code Online (Sandbox Code Playgroud)

为了解决关于向量的注释,记录的行为在常规向量上是相同的:

> x <- rnorm(5)
> x[] <- as.character(x)
> x
[1] "0.687551073804054"  "-1.17843752343875"  "0.144747745284427"  "-0.931480738737143" "0.394279275668583" 
> x[] <- as.integer(x)
> x
[1] "0"  "-1" "0"  "0"  "0" 
Run Code Online (Sandbox Code Playgroud)

  • @PhilGoetz我真的在努力弄清楚如何解释这个问题,因为你似乎没有意识到运行`as.integer(x)`和不分配给任何东西与分配到同一个对象之间的区别空括号`x [] < - ...`.这是两种不同的操作,处理方式不同. (3认同)