2016-06-08 2 views
1

У меня есть структура кадров с одной колонкой. Исходя из условия, я подмножаю рамку данных во время выполнения. Я заметил, что кадр данных преобразуется в вектор после подмножества. Я получил структуру фрейма данных, используя функцию as.data.frame().Причина трансформации одного столбчатого кадра данных в вектор после подмножества

# random generation of the values  
df <- data.frame(a=sample(1:1000,100)) 
#checking the class of the object 
class(df) 
#dimensions 
dim(df) 
#[1] 100 1 
#subsetting the data with a random value present in the df, here 547 
df_sub <- df[-df$a==547,] 
# checking the subset dataset class 
class(df_sub) 
#[1] "integer" 

Я хотел бы знать, как сохранить структуру кадра данных без явного использования функции as.data.frame().

+1

[Хедли 'tibble's] (https://github.com/hadley/tibble/) более единодушны в сохранении своего класса, что может быть полезно, если вы работаете программно и не уверены, когда вам может понадобиться 'drop = FALSE'. – alistaire

ответ

6

R часто пытается упростить объекты после Подменю. Если это не требуется, вы можете использовать падение = FALSE аргумента для предотвращения таких упрощений:

df_sub <- df[-df$a==547,, drop=FALSE] 

> class(df_sub) 
[1] "data.frame" 

Падения = ЛОЖЬ также доступно для матриц:

myMat <- matrix(1:10, 5) 

> class(myMat[, 1]) 
[1] "integer" 
> 
> class(myMat[, 1, drop=FALSE]) 
[1] "matrix" 
> 
> class(myMat[1, ]) 
[1] "integer" 
> 
> class(myMat[1, , drop=FALSE]) 
[1] "matrix" 
2

Вы можете использовать subset:

df_sub <- subset(df, a != 547) 
class(df_sub) #data.frame 
2

При использовании следующего примера, класс подмножества еще data.frame:

set.seed(1) 
df <- data.frame(a = sample(1:1000,100), b = sample(1:1000,100)) 
class(df) 
#data.frame 
df_sub <- df[-df$a == 706,] 
class(df_sub) 
#data.frame 

В вашем случае у вас есть 100x1 data.frame , который будет автоматически интерпретироваться как вектор. В моем примере это все равно data.frame.

Если вы хотите сохранить data.frame, вы должны были использовать:

df_sub <- subset(df, a != 706) 

С уважением,

J_F