3

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

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

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

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

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

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

海莉

4

2 回答 2

1

首先,正确使用 data.matrix 是:

data.matrix(UN2010)

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

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

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

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
)
于 2011-04-20T15:30:52.107 回答
0

尝试as.data.frame代替data.matrix.

于 2011-04-20T15:05:59.050 回答