2016-06-08 70 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" 

的下降= FALSE也可用於矩陣:

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