【问题标题】:How to convert character matrix to numeric, keeping first column as row name: R如何将字符矩阵转换为数字,将第一列保留为行名:R
【发布时间】:2017-08-15 18:05:10
【问题描述】:

我在下面有这个矩阵,应用循环将行名更改为数字。

这是矩阵:

             treatmenta treatmentb
John Smith   NA         " 2"      
John Doe     "16"       "11"      
Mary Johnson " 3"       " 1"   

这个代码as.matrix(apply(y, 2, as.numeric))

结果是这样,但我希望行名是人名

     treatmenta treatmentb
[1,]         NA          2
[2,]         16         11
[3,]          3          1

转换为 data.table 也不起作用。我该怎么做?

这里是重现数据的代码:

name <- c("John Smith", "John Doe", "Mary Johnson")
treatmenta <- c("NA", "16", "3")
treatmentb <- c("2", "11", "1")
y <- data.frame(name, treatmenta, treatmentb)
rownames(y) <- y[,1]
y[,1] <- NULL

【问题讨论】:

  • 根据显示的可重复数据,它是data.frame 而不是matrixy[] &lt;- lapply(y, function(x) as.numeric(as.character(x)))
  • 改用数据框。为什么它应该是一个矩阵?如果需要,您也可以单独cbind名称列。
  • 当您使用 reshape 包中的转置 t() 时,它会获取数据帧并将它们制成矩阵。我添加了最快的方法来生成数据,这是一个数据框。很抱歉,但很高兴知道。

标签: r matrix numeric


【解决方案1】:

我们可以的

y <- `dimnames<-`(`dim<-`(as.numeric(y), dim(y)), dimnames(y))
y
#              treatmenta treatmentb
#John Smith           NA          2
#John Doe             16         11
#Mary Johnson          3          1

或者一个紧凑的选项是

class(y) <- "numeric"

数据

y <- structure(c(NA, "16", " 3", " 2", "11", " 1"), .Dim = c(3L, 2L
), .Dimnames = list(c("John Smith", "John Doe", "Mary Johnson"
), c("treatmenta", "treatmentb")))

【讨论】:

  • 这似乎没有变成数字。也许我遗漏了一些东西,但是当我尝试添加 y[1,2] + y[2,2] 时,我得到了 Error in y[1, 2] + y[2, 2] : non-numeric argument to binary operator
  • @BrianWiley 您需要将其分配给y,即y &lt;- ,然后执行y[1,2] + y[2,2] #[1] 13
  • 好的,谢谢。紧凑选项我没有收到错误Error in class(y) &lt;- "numeric" : (list) object cannot be coerced to type 'double'
  • @BrianWiley 我假设你有一个matrix,正如你在帖子中提到的那样。如果您使用我帖子中的数据,它应该可以正常工作。看起来您有一个关于如何创建数据的新代码。数据集是 data.frame 而不是 matrix
【解决方案2】:

您将从更通用的数据形式(数据框)转换为矩阵(具有 dim 属性的向量)。在此 as.matrix 或任何将数据转换为矩阵的基础方法最终将调用 vector(x) 这是通用函数,将所有变量设置为字符或将所有内容设置为数字,但将名称列设置为 NAs(取决于如何你称之为 as.matrix)。

话虽如此,如果由于某种原因您仍然必须使用矩阵形式,那么使用它以获得更好的可读性:

treatmenta <- c("1", "16", "3")
treatmentb <- c("2", "11", "1")
y[,1] <- as.matrix(sapply(treatmenta, as.numeric))
y[,2] <- as.matrix(sapply(treatmentb, as.numeric))
#now they are not factors. 
#> class(y)
#[1] "matrix"

name <- c("John Smith", "John Doe", "Mary Johnson")
row.names(y) <- name
# treatmenta treatmentb
# John Smith            1          2
# John Doe             16         11
# Mary Johnson          3          1

【讨论】:

  • 是的,我在另一篇文章中看到了这一点。这给了我以下信息:treatmenta treatmentb [1,] NA 2 [2,] 16 11 [3,] 3 1 它删除了行名。
  • 刚刚编辑了答案。再看看。移除了 NA 但如果它具有 NA 值就不会成为问题。 @BrianWiley
  • 对,如果您使用 t() 将您的数据从数字转换为字符,我指的是一个示例数据集。因此,如果我们有一个庞大的数据集,我们就不会像这样创建。它已经转置为字符矩阵。您必须将其转换回数字。
  • 矩阵中不能有行名。 as.matrix 调用 vector(x) 这是一种通用的原子方法 - 将所有内容转换为一种类型或另一种类型。使用rownames() 分别在最后添加名称。 @BrianWiley
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2019-08-16
相关资源
最近更新 更多