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