2016-11-14 76 views
0

「as.X」運算符通常將一種類型轉換爲另一種類型,但as.integer在應用於數組時失敗。這是一個錯誤?這是Microsoft R Open 3.3的64位版本,也是R Foundation的R 3.3.1 for i686-pc-cygwin(32位)。R:爲什麼as.character將int matrix轉換爲char,但是as.integer不會將char matrix轉換爲int?

> 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" 
+4

如果您分配給矩陣或向量的子集,矩陣/向量的類型只能更改爲更高(更一般)的類型。 – Roland

+0

......特別是,'m [] < - as.integer(m)'按我的想法工作,我想。 – joran

+0

@joran:m [] < - as.integer(m)不能像我期望的那樣工作。查看我已發佈的代碼。 –

回答

6

的文檔狀態:

當一個索引表達在賦值 的左側出現(稱爲subassignment)則x的一部分被設置爲 右手值任務的一面。在這種情況下,沒有完成字符索引的部分 匹配,並且根據需要左側的 被強制接受值。對於載體,答案將 層次結構中的原始< 邏輯<整數<雙<複雜<字符<列表<表達是的類型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" 

最後,as.integer往往不字符轉換爲有效整數:

> str(as.integer("a")) 
int NA 
Warning message: 
In str(as.integer("a")) : NAs introduced by coercion 

...但它導致的NA,即NA_integer_整數味道。但是,這將字符轉換爲整數,只要沒有subassignment:

> str(as.integer("1")) 
int 1 

爲了解決有關向量的評論,該記錄的行爲是在普通矢量是相同的:

> 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" 
+0

我正要寫出完全相同的答案,與文檔中的引用相同! – nicola

+0

嘗試x = as.character(1:9); X; as.integer(x) –

+0

該文檔不適用於此。首先,文檔是關於向量的,as.integer按照我期望的向量行事,將字符轉換爲整數。其次,它是關於隱含的強制,而不是關於明確的轉換,這是整數應該做的。 –

3

如果你這樣做要「向下轉換」矩陣你可能在storage.mode()<-感興趣:

> m <- matrix(1:4,2) 
> m 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 
> storage.mode(m) <- "character" 
> m 
    [,1] [,2] 
[1,] "1" "3" 
[2,] "2" "4" 
> storage.mode(m) <- "integer" 
> m 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 
0

Joran的答案給出了導致這種行爲的規則。這條規則的原因是子分配有時會發生,有時不會在整個數據結構上運行。在這種情況下,它不能轉換整個矢量或矩陣的數據類型。在m [] = ...的情況下,它可以,但最好在所有情況下以相同的方式運行。否則,在通過索引進行子分配恰好覆蓋整個向量或矩陣的情況下,它會引入錯誤。