1

我有一个数据框,其中的列包含可变数量的数字和可变数量的 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"

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

4

3 回答 3

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
于 2012-02-28T18:15:57.047 回答
2

怎么样

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

它只是将每一列转换为数字(在第一次转换为字符之后)。您必须小心这一点,因为将因子转换为数字通常会导致基础整数代码,而不是您看到的显示值。

于 2012-02-28T18:12:47.813 回答
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。

于 2012-02-28T18:17:30.670 回答