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

7

为什么我的最后一步要将数据框转换为向量?我想保留数据框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
is.data.frame(key[1:6000,,drop=F]) [1] TRUE - akrun
如果您只需要这些,可以使用 key <- data.frame(key[1:6000,]) - oliver13
1
@Eric Green。请查看?Extract drop: 对于矩阵和数组。如果为“TRUE”,结果将被强制转换为最低可能的维度(参见示例)。这仅适用于提取元素,而不适用于替换。有关更多详细信息,请参见“drop”。 - akrun
@NerdLife的回答澄清了问题。 - Eric Green
@Eric Green。如果您只有一个列,如文档中所述,它会被强制转换为最低维度,即向量is.vector(key) [1] TRUE,但当您有多个列时情况并非如此。 - akrun
显示剩余4条评论
2个回答

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

根据?Extract.data.frame的文档:

drop: 逻辑型。如果为“TRUE”,则结果将被强制转换为最低可能的维度。默认情况下,只有一列剩余时会删除,但如果只剩下一行,则不会删除。

或者,您可以使用subset,但通常速度较慢。这里的行名称是从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

0

它基本上被强制转换为向量,因为它可以并且当只有一个元素时这是默认的强制转换。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

这个可以运行,但我更喜欢 key[1:6000,,drop=F],因为它保留了我的列名。as.data.frame(key[1:6000,]) 会改变列名。 - Eric Green
@EricGreen 好的,很公平。 - Hack-R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接