将字符矩阵列转换为数字矩阵

时间:2018-10-16 00:02:59

标签: r

我想执行热图。我将数据帧传输到矩阵。矩阵的第一列包含51个字符格式的状态名称。因此,当我执行热图时,会弹出一个错误(“ X”必须为数字)。如果将矩阵转换为数字,则所有状态都将转换为1到51之间的数字值。状态名称将更改为数字。我希望有人能帮助我将字符列转换为数字,而无需更改该列中的任何值。  enter image description here 我收到以下错误:

> heatmap.2(matrix)
Error in heatmap.2(matrix) : `x' must be a numeric matrix

dput(matrix[1:20,1:5])
structure(c("AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", 
"FL", "GA", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", 
" 156023.01", " 934292.20", " 565543.16", " 859246.77", "1802826.03", 
" 236048.04", " 277419.16", "  44170.06", " 364245.19", "3059883.80", 
"1032052.28", "  49148.00", " 484355.76", " 103032.97", "1501399.16", 
"1098716.37", " 536964.81", " 714912.96", " 930454.92", "1006184.61", 
NA, " 647281.97", " 243467.03", " 222016.05", "1955376.54", " 284157.80", 
" 546510.14", " 310209.01", " 238855.76", "3055374.94", " 620487.04", 
"  52286.08", " 183689.95", " 101198.95", "2299302.42", " 682522.43", 
" 203429.06", " 566182.29", " 434137.97", "1269701.60", "  279984.88", 
" 1785117.72", " 1210217.08", " 1738388.11", "12313826.52", " 1033786.31", 
" 1905870.34", " 1589936.20", " 1177198.27", " 7379680.11", " 3182089.09", 
"  539865.15", "  907408.47", "  706547.91", " 5616722.28", " 2793763.32", 
"  751262.24", " 2620593.80", " 3327343.31", " 3423941.61", "  277346.4", 
" 3231424.9", " 1784411.7", " 2539940.3", "13107647.6", " 1623508.4", 
" 2475804.7", " 1382151.2", " 1362240.3", "10431341.9", " 4514651.7", 
" 1081821.1", " 1653629.7", "  594605.5", " 9147134.3", " 4121661.9", 
" 1292330.2", " 3252592.8", " 3360762.2", " 4269284.1"), .Dim = c(20L, 
5L), .Dimnames = list(NULL, c("Provider.State", "039 ", "057 ", 
"064 ", "065 ")))

2 个答案:

答案 0 :(得分:0)

可以使用purrr软件包

尝试以下内容:

library(purrr) df<-df %>% map_if(is.factor,as.character) %>% as.matrix

答案 1 :(得分:0)

(我将其命名为m,以便不覆盖matrix函数。)

首先,您的第一列是标识符。我要推断它们的含义,因此我将其保留为行名,但这不会改变结果。

head(m)
#      Provider.State 039          057          064           065         
# [1,] "AK"           " 156023.01" NA           "  279984.88" "  277346.4"
# [2,] "AL"           " 934292.20" " 647281.97" " 1785117.72" " 3231424.9"
# [3,] "AR"           " 565543.16" " 243467.03" " 1210217.08" " 1784411.7"
# [4,] "AZ"           " 859246.77" " 222016.05" " 1738388.11" " 2539940.3"
# [5,] "CA"           "1802826.03" "1955376.54" "12313826.52" "13107647.6"
# [6,] "CO"           " 236048.04" " 284157.80" " 1033786.31" " 1623508.4"

rn <- m[,1]
m <- m[,-1]
rn
#  [1] "AK" "AL" "AR" "AZ" "CA" "CO" "CT" "DC" "DE" "FL" "GA" "HI" "IA" "ID" "IL" "IN" "KS" "KY" "LA" "MA"
head(m)
#      039          057          064           065         
# [1,] " 156023.01" NA           "  279984.88" "  277346.4"
# [2,] " 934292.20" " 647281.97" " 1785117.72" " 3231424.9"
# [3,] " 565543.16" " 243467.03" " 1210217.08" " 1784411.7"
# [4,] " 859246.77" " 222016.05" " 1738388.11" " 2539940.3"
# [5,] "1802826.03" "1955376.54" "12313826.52" "13107647.6"
# [6,] " 236048.04" " 284157.80" " 1033786.31" " 1623508.4"

(我们将在一分钟内使用rn。)现在我们需要将所有内容都转换为数字。

m <- apply(m, 2, as.numeric)
rownames(m) <- rn
head(m)
#         039       057        064        065 
# AK  156023.0        NA   279984.9   277346.4
# AL  934292.2  647282.0  1785117.7  3231424.9
# AR  565543.2  243467.0  1210217.1  1784411.7
# AZ  859246.8  222016.0  1738388.1  2539940.3
# CA 1802826.0 1955376.5 12313826.5 13107647.6
# CO  236048.0  284157.8  1033786.3  1623508.4

现在热图起作用了。

heatmap(m)

heatmap plot