【问题标题】:Convert character matrix column to numeric matrix将字符矩阵列转换为数值矩阵
【发布时间】:2018-10-16 00:02:59
【问题描述】:

我想执行热图。我将数据帧转移到矩阵。我在矩阵中的第一列包含 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 ")))

【问题讨论】:

  • 这听起来像您有factors,它们在转换为numeric 之前被转换为它们的integer 索引。试试as.numeric(as.character(...)) 看看是否有变化。
  • 它不起作用。如果我在数据框中执行它,它将整个列更改为 NA。在矩阵中,值会发生变化。
  • 有一个可重复的问题会有所帮助。这包括示例代码(包括列出非基础 R 包)、示例数据(例如,dput(head(x))),并且您已声明您的预期输出是热图。参考:stackoverflow.com/questions/5963269stackoverflow.com/help/mcvestackoverflow.com/tags/r/info
  • 即使查看了链接,我仍然无法找到我的问题的答案。你能帮我提供它的代码吗?
  • 这些链接不是为了帮助您找到问题的答案,这些链接旨在帮助您改进您的问题,以便我们可以帮助您回答您的问题。当我问“你的数据是什么样的”这个问题时,我不想知道它有 m 行和 n 列......我想以某种有代表性的形式查看实际数据。如果您的数据有点大,那么(正如我之前建议的并且在两个链接中提到的)使用dput(head(x))

标签: r


【解决方案1】:

(我将其命名为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)

【讨论】:

    【解决方案2】:

    可以用purrr包来完成

    试试下面:

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

    【讨论】:

    • 根据您的命令,它将数据框更改为列表类型。但我不想将其更改为任何其他格式,因为热图只接受矩阵格式。总计% map_if(is.factor,as.character) %>% as.matrix
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多