如何更改因子的数据帧,以便可以对数据帧进行boxplotted?

时间:2012-02-28 17:54:34

标签: r dataframe boxplot r-factor

我有一个数据框,其中的列包含可变数量的数字和可变数量的NA。数据框如下所示:

    V1 V2 V3 V4 V5 V6
1    0 11  4  0  0 10
2    0 17  3  0  2  2
3   NA  0  4  0  1  9
4   NA 12 NA  1  1  0
<snip>
743 NA NA NA NA  8 NA
744 NA NA NA NA  0 NA

我想制作一个箱形图,但是当我这样做时

boxplot(dataframe)

我收到错误

adding class "factor" to an invalid object

当我这样做时

lapply(dataframe,class)

我得到了以下输出:

$V1
[1] "factor"
$V2
[1] "factor"
<snip>
$V6
[1] "factor"

那么如何更改我的数据框以便将列视为数字?

3 个答案:

答案 0 :(得分:5)

您想将as.numeric(as.character(...))应用于每个因子列。下面的代码显示了如何只影响因子变量而不仅仅是数字类型。

## dummy data
df <- data.frame(V1 = factor(sample(1:5, 10, rep = TRUE)),
                 V2 = factor(sample(99:101, 10, rep = TRUE)),
                 V3 = factor(sample(1:2, 10, rep = TRUE)),
                 V4 = 1:10)

df2 <- data.frame(sapply(df, function(x) { if(is.factor(x)) {
                                              as.numeric(as.character(x))
                                           } else {
                                              x
                                           }
                                         }))

这给出了:

> df2
   V1  V2 V3 V4
1   4 101  2  1
2   1 100  1  2
3   5  99  2  3
4   4  99  2  4
5   2 100  1  5
6   2 100  2  6
7   2 101  2  7
8   4 100  1  8
9   2 101  2  9
10  4 101  1 10
> str(df2)
'data.frame':   10 obs. of  4 variables:
 $ V1: num  4 1 5 4 2 2 2 4 2 4
 $ V2: num  101 100 99 99 100 100 101 100 101 101
 $ V3: num  2 1 2 2 1 2 2 1 2 1
 $ V4: num  1 2 3 4 5 6 7 8 9 10

答案 1 :(得分:2)

怎么样

as.data.frame(lapply(dat1,function(x){as.numeric(as.character(x))}))

只是将每列转换为数字(首先转换为字符后)。您必须小心这一点,因为将因子简单地转换为数字通常会导致基础整数代码,而不是您看到的值。

答案 2 :(得分:1)

使用测试data.frame:

testframe <- data.frame(V1 = as.factor(c(0,0,NA,NA)), V2 = as.factor(c(11,17,0,12)))

> sapply(testframe, class)
      V1       V2 
"factor" "factor" 

您可以使用

testframe.n <- as.data.frame(sapply(testframe, as.numeric))

> sapply(testframe.n, class)
       V1        V2 
"numeric" "numeric" 

现在,所有列都应该是数字,并且可以调用boxplot。