将因子级别转换为数字

ruc*_*ker 5 r matrix na

如果那里已经有了答案我道歉...我看了但找不到一个.

我试图将因子矩阵转换为对应于列的每个因子值的数字矩阵.简单吧?然而,当我尝试这样做时,我遇到了各种非常奇怪的问题.

让我解释.这是一个示例数据集:

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
Run Code Online (Sandbox Code Playgroud)

产量:

     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 
Run Code Online (Sandbox Code Playgroud)

好.所以我想要的是:

     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>
Run Code Online (Sandbox Code Playgroud)

没问题.我们试试吧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 
Run Code Online (Sandbox Code Playgroud)

不满意.我们只尝试一栏......

> as.numeric(demodata2[,3])
[1] NA NA NA NA NA NA
Warning message:
NAs introduced by coercion 
Run Code Online (Sandbox Code Playgroud)

*编辑*

这些实际上应该是因素,而不是字符(感谢@Carl Witthoft和@smci)...所以让我们把它变成一个数据帧......

> demodata2 <- as.data.frame(demodata2)
> as.numeric(demodata2)
Error: (list) object cannot be coerced to type 'double'
Run Code Online (Sandbox Code Playgroud)

不.但是等等......这里有趣的地方......

> as.numeric(demodata2$S)
[1] NA  2 NA  3  1  2
Run Code Online (Sandbox Code Playgroud)

嗯,这是对的.让我们验证我可以按编号调用列:

> as.numeric(demodata2[,3])
[1] NA  2 NA  3  1  2
Run Code Online (Sandbox Code Playgroud)

好.所以我可以通过迭代ncol时间来按列组装我的新矩阵来做这个列...但是有更好的方法吗?

为什么它是矩阵形式的barf,而不是数据框?< - 实际编辑,现在很明显......在矩阵形式中,这些是字符,而不是因素.我的错.问题仍然在于数据框架,但......

谢谢!(并指出我现有的答案是完全正常的)

Ric*_*ven 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
Run Code Online (Sandbox Code Playgroud)

你也可以得到这个结果

m <- match(demodata2, LETTERS)
attributes(m) <- attributes(demodata2)
Run Code Online (Sandbox Code Playgroud)

然后看看 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
Run Code Online (Sandbox Code Playgroud)

现在,您在U列中有1个,因为每个列都是单独的因子,因此B是该列中的第一个(也是唯一的)值.


Gre*_*gor 5

从机制上讲,这与'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
Run Code Online (Sandbox Code Playgroud)