如果我已经有了答案,我道歉...我看了但找不到答案。
我正在尝试将因子矩阵转换为与列的每个因子值相对应的数字矩阵。简单吧?然而,当我尝试这样做时,我遇到了各种非常奇怪的问题。
让我解释一下。这是一个示例数据集:
demodata2 <- matrix(c("A","B","B","C",NA,"A","B","B",NA,"C","A","B",NA,"B",NA,"C","A","B",NA,NA,NA,"B","C","A","B","B",NA,"B","B",NA,"B","B",NA,"C","A",NA), nrow=6, ncol=6)
democolnames <- c("Q","R","S","T","U","W")
colnames(demodata2) <- democolnames
产量:
Q R S T U W
[1,] "A" "B" NA NA "B" "B"
[2,] "B" "B" "B" NA "B" "B"
[3,] "B" NA NA NA NA NA
[4,] "C" "C" "C" "B" "B" "C"
[5,] NA "A" "A" "C" "B" "A"
[6,] "A" "B" "B" "A" NA NA
确定。所以我想要的是:
Q R S T U W
1 1 2 <NA> <NA> 1 2
2 2 2 2 <NA> 1 2
3 2 <NA> <NA> <NA> <NA> <NA>
4 3 3 3 2 1 3
5 <NA> 1 1 3 1 1
6 1 2 2 1 <NA> <NA>
没问题。让我们试试as.numeric(demodata2)
> as.numeric(demodata2)
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[30] NA NA NA NA NA NA NA
Warning message:
NAs introduced by coercion
不满意。我们只尝试一栏......
> as.numeric(demodata2[,3])
[1] NA NA NA NA NA NA
Warning message:
NAs introduced by coercion
*编辑*
这些实际上应该是因素,而不是角色(感谢@Carl Witthoft和@smci)...所以让我们把它变成数据帧......
> demodata2 <- as.data.frame(demodata2)
> as.numeric(demodata2)
Error: (list) object cannot be coerced to type 'double'
不。 但是等等......这里有趣的地方......
> as.numeric(demodata2$S)
[1] NA 2 NA 3 1 2
嗯,这是对的。让我们验证我可以按号码调用列:
> as.numeric(demodata2[,3])
[1] NA 2 NA 3 1 2
确定。所以我可以通过迭代ncol
次来组合我的新矩阵来完成这个专栏...但是有更好的方法吗?
为什么它是矩阵形式的barf,而不是数据框? &lt; - 编辑 实际上,现在很明显......在矩阵形式中,这些是字符,而不是因素。我的错。问题仍然在于数据框架,但是......
谢谢! (并指出我现有的答案完全没问题)
答案 0 :(得分:6)
似乎您的U
列应该是2对应于“B”,而不是1.请澄清。
您可以尝试match()
matrix(match(demodata2, LETTERS), nrow(demodata2), dimnames=dimnames(demodata2))
# Q R S T U W
# [1,] 1 2 NA NA 2 2
# [2,] 2 2 2 NA 2 2
# [3,] 2 NA NA NA NA NA
# [4,] 3 3 3 2 2 3
# [5,] NA 1 1 3 2 1
# [6,] 1 2 2 1 NA NA
您也可以使用
获得此结果m <- match(demodata2, LETTERS)
attributes(m) <- attributes(demodata2)
然后查看m
修订数据集的更新:
要获取更新的数据,请尝试
demodata2[] <- lapply(demodata2, as.numeric)
demodata2
# Q R S T U W
# 1 1 2 NA NA 1 2
# 2 2 2 2 NA 1 2
# 3 2 NA NA NA NA NA
# 4 3 3 3 2 1 3
# 5 NA 1 1 3 1 1
# 6 1 2 2 1 NA NA
现在您在U
列中有1个,因为每个列都是单独计算的,因此B
是该列中的第一个(也是唯一的)值。
答案 1 :(得分:4)
从机械上讲,这与'dim<-'
答案非常相似。更透明,但效率可能更低(可能?)。
matrix(as.numeric(factor(demodata2)), ncol = ncol(demodata2))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 NA NA 2 2
[2,] 2 2 2 NA 2 2
[3,] 2 NA NA NA NA NA
[4,] 3 3 3 2 2 3
[5,] NA 1 1 3 2 1
[6,] 1 2 2 1 NA NA
答案 2 :(得分:3)
或使用dim<-
`dim<-`(as.numeric(factor(demodata2)), c(nrow(demodata2), ncol(demodata2)))
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 2 NA NA 2 2
# [2,] 2 2 2 NA 2 2
# [3,] 2 NA NA NA NA NA
# [4,] 3 3 3 2 2 3
# [5,] NA 1 1 3 2 1
# [6,] 1 2 2 1 NA NA
如果您需要列名,则必须按照
中的两个步骤执行此操作Res <- `dim<-`(as.numeric(factor(demodata2)), c(nrow(demodata2), ncol(demodata2)))
colnames(Res) <- colnames(demodata2)
答案 3 :(得分:2)
apply(demodata2, 2, function(x)
as.numeric( factor(x ,levels=unique(as.vector(demodata2) ) ) ) )
#---------------
Q R S T U W
[1,] 1 2 NA NA 2 2
[2,] 2 2 2 NA 2 2
[3,] 2 NA NA NA NA NA
[4,] 3 3 3 2 2 3
[5,] NA 1 1 3 2 1
[6,] 1 2 2 1 NA NA
(我通过错误的答案发现矩阵上的unique
没有返回我的预期。)