7

假设我创建了一个数据框(只是为了简单起见):

testframe <- data.frame( a = c(1,2,3,4), b = c(5,6,7,8))

因此,我有两个变量(列)和四个案例(行)。

如果我选择一些从第一行开始的行,我会得到数据框的某种子集,例如:

testframe2 <- testframe[1:2,] #selecting the first two rows

但是,如果我对不从第一行开始的行做同样的事情,我会得到另一列包含原始数据帧的行号。

testframe3 <- testframe[3:4,] #selecting the last two rows

导致:

  a b
3 3 7
4 4 8

我能做些什么来首先防止新的 row.names 变量?我知道我可以在之后删除它,但也许仍然可以从一开始就避免它。

谢谢你的帮助!

4

1 回答 1

4

row.names它从原始数据集中复制。只需像这样重命名行rownames<-...

rownames( testframe3 ) <- seq_len( nrow( testframe3 ) )
#   a b
# 1 3 7
# 2 4 8

最好以编程seq_len( nrow( x ) )方式说,因为看起来在您选择零行1:nrow( x )的边缘情况下会发生什么......data.frame

df <- testframe[0,]
# [1] a b
# <0 rows> (or 0-length row.names)
rownames(df) <- seq_len( nrow( df ) ) #  No error thrown - returns a length 0 vector of rownames

#  But...
rownames(df) <- 1:nrow( df )
# Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
#   invalid 'row.names' length

#  Because...
1:nrow( df )
# [1] 1 0

或者,您可以通过将子集包装在一个调用中来做到这一点,data.frame但是如果您想以编程方式导出行数(因为您将不得不对子集进行两次),这确实效率低下,而且我不建议在rownames<-方法上使用它:

data.frame( testframe[3:4,] , row.names = 1:2 )
#  a b
#1 3 7
#2 4 8
于 2013-10-24T12:33:39.783 回答