数值取决于应用的应用族,R

数值取决于应用的应用族,R,r,casting,apply,R,Casting,Apply,我有一个表,有一些数字和字符列,一些是因子和其他整数 >additional.metadata sample_id patient_id condition SOM test 1387 1 1 CTL 22 1 7588 1 1 CTL 35 2 7429 1 1 CTL 23 3 7600 1

我有一个表,有一些数字和字符列,一些是因子和其他整数

>additional.metadata
      sample_id patient_id condition SOM test
1387          1          1       CTL  22    1
7588          1          1       CTL  35    2
7429          1          1       CTL  23    3
7600          1          1       CTL  35    4
我试图将整个表转换为一个矩阵,并根据使用的
apply
选项(即
apply
vs
sapply
),更改$SOM中的一些值。下面是一个例子:

> apply(additional.metadata, 2, function(x) as.numeric(as.factor(x)))
     sample_id patient_id condition SOM test
[1,]         1          1         1   2    1
[2,]         1          1         1   4    2
[3,]         1          1         1   3    3
[4,]         1          1         1   4    4
[5,]         1          1         1   1    5
[6,]         1          1         1   3    6
> sapply(additional.metadata, function(x) as.numeric(as.factor(x)))
     sample_id patient_id condition SOM test
[1,]         1          1         1  22    1
[2,]         1          1         1  35    2
[3,]         1          1         1  23    3
[4,]         1          1         1  35    4
[5,]         1          1         1  11    5
[6,]         1          1         1  23    6

请有人知道我遗漏了什么/误解了什么?提前感谢。

最有可能的变化是由于
as.numeric(as.factor(x))
造成的

为了确保您的值符合预期,您需要将其转换为
字符
或完全跳过因子阶段

使用
as.numeric(as.character(as.factor(x)))
as.numeric(as.character(x))

关于您为什么需要这样做的解释可以在这个问题的顶部答案中找到:


(这是一个常见的问题。)
apply
始终将其第一个参数转换为
矩阵。当存在任何
字符
列时,所有内容都变为
字符
,句点。通常,您会在列的子集上使用
apply
,例如,
apply(x[,c(1:3,5)],2,…)
,以便只使用真正需要的数字列。如果您需要帧帮助(作为
数字
因子
字符
),则必须以
dput(头(x))的形式提供可用数据
;控制台输出不明确。谢谢,我不知道这个
apply
的矩阵转换,非常有用。您的预期输出是什么?我想用数值转换$SOM col,但保留其原始数值,而不重新编码它们(这就是我问的原因)。谢谢Garces,我不是没有理由这么说的:在给我们提供样本数据时使用
dput
提供了明确的数据。您提供的内容不清楚,因为R的控制台输出不区分
整数
、整数
、整数、
系数
、数字字符。所以我们不能帮助你,除非你提供一些能代表你所拥有的东西。同样地,请通过向我们提供来自
dput(head(additional.metadata))
的输出来提供数据。感谢您的回答,但是如果我使用
as.numeric(as.character(x))
因为字符cols,一些值被错误地转换为NAs。