获得'class()'方法的不同结果

时间:2014-09-17 07:54:04

标签: r

这里是最小的一段代码,它显示了当使用apply调用时直接调用列时,我如何得到class()的不同结果。

data.frame看起来像这样。

> df
    A             B             C
1 rlm  4.047317e-03  0.0040111713
2 rlm -6.474359e-02 -0.0657461598
3 rlm  1.464302e-01  0.1451224214
4 rlm  3.508878e-01  0.3477540761
5  lm  2.701757e-01  0.2769367280
6  lm  2.580785e-03  0.0025815525
7 rlm  1.638077e-05  0.0000160895

> str(df)
'data.frame':   7 obs. of  3 variables:
 $ A: chr  "rlm" "rlm" "rlm" "rlm" ...
     $ B: num  0.00405 -0.06474 0.14643 0.35089 0.27018 ...
 $ C: num  0.00401 -0.06575 0.14512 0.34775 0.27694 ...

> class(df$A)
    [1] "character"
    > class(df$B)
[1] "numeric"
> apply(df, 2, class)
          A           B           C 
"character" "character" "character" 

因此,当直接调用B的类是“数字”时,但是当使用“应用”调用时,它会说“'字符”。

我在这里遗漏了什么吗?

2 个答案:

答案 0 :(得分:1)

在应用函数之前,将data.frames强制应用于矩阵。因为在矩阵中,每个元素必须具有相同的类,所以您最终会得到一个字符矩阵(因为您可以将数字转换为字符而不会丢失信息而不是其他方式)。这样做的原因可能是您也可以按行应用函数,这会使data.frames变得混乱,因为您的函数需要在列表上运行。

你想要的是检查lapply和sapply函数,因为data.frames基本上是列表,列表的每个元素都是列之一。

> x <- data.frame(a = "Entry", b = 5)
> sapply(x, class)
        a         b 
 "factor" "numeric"   

答案 1 :(得分:0)

我得到了相同的结果。我认为这可能与您在此示例中看到的行为相同:

number_m <- matrix(1:6)
mode(number_m) # "numeric"

number_m[2,1] <- "b"
mode(number_m) # "character"
number_m

将矩阵或向量的一个元素转换为字符会改变所有元素的数据类型。

我使用循环得到了正确的结果:

df <- read.table(header=TRUE, text="
    A             B             C
1 rlm  4.047317e-03  0.0040111713
2 rlm -6.474359e-02 -0.0657461598
3 rlm  1.464302e-01  0.1451224214
4 rlm  3.508878e-01  0.3477540761
5  lm  2.701757e-01  0.2769367280
6  lm  2.580785e-03  0.0025815525
7 rlm  1.638077e-05  0.0000160895")

sapply(1:3, function(i) class(df[,i]))