按行索引对数据进行子集化

时间:2014-08-06 16:57:40

标签: r

为什么我的最后一步是将数据框转换为矢量?我想在数据框key中保留前6000个观测值。

  set.seed(1)
  key <- data.frame(matrix(NA, nrow = 10000, ncol = 1))
  names(key) <- "ID"
  key$ID <- replicate(10000, 
                      rawToChar(as.raw(sample(c(48:57,65:90,97:122), 8, replace=T))))
  key <- unique(key)  # still a data frame
  key <- key[1:6000,] # no longer a data frame

2 个答案:

答案 0 :(得分:2)

 key1 <- key[1:6000,,drop=F] #should prevent the data.frame from converting to a vector.

根据?Extract.data.frame

的文件
  

drop:逻辑。如果为“TRUE”,则结果强制为最低             可能的维度。如果只有一个,则默认为丢弃             如果只剩下一行,则保留列,但要删除。

或者,您可以使用subset,但通常情况下,这有点慢。这里的row.names是从110000

的数字
 key2 <- subset(key, as.numeric(rownames(key)) <6000)

 is.data.frame(key2)
 #[1] TRUE

因为,

 ## S3 method for class 'data.frame'
 subset(x, subset, select, drop = FALSE, ...) #by default it uses drop=F

答案 1 :(得分:0)

它被强制转换为一个向量,主要是因为当只有一个元素时它可以和that's the default强制。 R试图“乐于助人”。

这会将其保留为数据框:

set.seed(1)
key <- data.frame(matrix(NA, nrow = 10000, ncol = 1))
names(key) <- "ID"
key$ID <- replicate(10000, 
                      rawToChar(as.raw(sample(c(48:57,65:90,97:122), 8, replace=T))))
key <- unique(key)  
key <- as.data.frame(key[1:6000,]) # still a data frame