如何将多数因子的数据帧转换为数值矩阵;取消列表不起作用

时间:2011-04-20 14:48:17

标签: r matrix dataframe r-factor

我无法将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

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

如果你能在任何方面帮助我,我将深表感谢。 非常感谢你!

Haillie

2 个答案:

答案 0 :(得分:1)

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

data.matrix(UN2010)

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

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

你可能在某个地方有一个字符列。将其转换为数字给出NA。如果您不想这样做,请将其从进一步分析中排除。一种可能性是使用colwise()包中的plyr来仅转换因子:

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

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

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

将返回一个矩阵,其中所有非字符列都转换为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
)

答案 1 :(得分:0)

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