Как я могу изменить структуру данных факторов, чтобы можно было построить коробку данных? - PullRequest
1 голос
/ 28 февраля 2012

У меня есть фрейм данных, столбцы которого содержат переменное количество чисел и переменное количество 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 ]

5 голосов
/ 28 февраля 2012

Вы хотите применить 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
2 голосов
/ 28 февраля 2012

Как насчет

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

, который просто преобразует каждый столбец в числовой (после первого преобразования в символ). Вы должны быть осторожны с этим, потому что наивное преобразование коэффициентов в числовые обычно приводит к целочисленным кодам, а не к отображаемым значениям.

1 голос
/ 28 февраля 2012

с тестовыми данными. Кадр:

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.

...