gpt4 book ai didi

r - 将因子水平转换为数字

转载 作者:行者123 更新时间:2023-12-02 12:26:22 25 4
gpt4 key购买 nike

如果已经有答案,我深表歉意...我查看了但找不到答案。

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

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

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 次来逐列组装新矩阵......但是有更好的方法吗?

为什么当它是矩阵形式而不是数据帧时它会呕吐? <- 编辑实际上,这现在非常明显......在矩阵形式中,这些是字符,而不是因子。我的错。不过,关于数据框的问题仍然存在......

谢谢! (向我指出现有的答案是完全可以的)

最佳答案

您的 U 列似乎应该是对应于“B”的 2,而不是 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 是该列中的第一个(也是唯一一个)值。

关于r - 将因子水平转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27627941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com