【问题标题】:How to convert dataframe of mostly factors into numeric matrix; unlist is not working如何将主要因子的数据框转换为数值矩阵;取消列表不起作用
【发布时间】:2011-04-20 14:48:16
【问题描述】:

我无法将data.frame 转换为矩阵格式。因为我想将我的 data.frame 与主要因子变量更改为数字矩阵,所以我使用了以下代码

UN2010frame <- data.matrix(lapply(UN2010, as.numeric))

但是,当我检查UN2010frame 的模式时,它仍然显示为一个列表。因为我要运行的代码(Ordrating)不接受列表格式的数据,所以我使用UN2010matrix &lt;- unlist(UN2010frame) 取消列出我的矩阵。当我这样做时,我的第一行(以前是带有列名的行)变成了 NA。这对我来说是个问题,因为当我尝试使用此数据集运行有序 IRT 模型时,我收到以下错误消息。

> Error in 1:nrow(Y) : argument of
> length 0

我认为这是因为我第一行中的所有值现在都消失了。

如果您能在任何方面帮助我,我们将不胜感激。 非常感谢!

海莉

【问题讨论】:

  • 能否请您提供一个UN2010 的小样本,以便我们尝试重现您的结果?
  • 你为什么不只是做data.matrix(UN2010) ? data.matrix 首先将所有列转换为数字,然后绑定它们。所以整个 lapply 是完全没有必要的。更重要的是,它会破坏您的代码,因为它会返回一个列表。

标签: r matrix dataframe r-factor


【解决方案1】:

首先,data.matrix的正确用法是:

data.matrix(UN2010)

因为它会自动转换为数字。代码中的 lapply 是您得到的错误的第一个来源。您在 data.matrix 函数中放置了一个列表,而不是数据框。所以它返回一个矩阵列表,而不是矩阵。

其次,unlist 返回一个向量,而不是矩阵。所以很确定你不会找到“带有NA的第一行”,因为你有一个向量。这可能解释了你的部分困惑。

您可能在某处有一个字符列。将其转换为数字给出 NA。如果您不希望这样做,则将它们排除在进一步分析之外。一种可能性是使用plyr 包中的colwise() 仅转换因子:

colwise(as.numeric,is.factor)(UN2010)

返回一个只有因子的数据框。这可以通过data.matrix()as.matrix() 轻松转换。或者,您使用基本解决方案:

id <- sapply(UN2010,is.character)
sapply(UN2010[!id],as.numeric)

这将返回一个矩阵,其中所有非字符列都转换为数字。如果你真的想保留所有原始列的数据框,你可以这样做:

UN2010frame <- UN2010
UN2010frame[!id] <- lapply(UN2010[!id],as.numeric)

玩具示例代码:

UN2010 <- data.frame(
  F1 = factor(rep(letters[1:3],10)),
  F2 = factor(rep(letters[5:10],5)),
  Char = rep(letters[11:16],each=5),
  Num = 1:30,
  stringsAsFactors=FALSE
)

【讨论】:

    【解决方案2】:

    尝试as.data.frame 而不是data.matrix

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多