R - 从数据框中选择行时如何防止row.names

时间:2013-10-24 12:13:03

标签: r dataframe row

假设我创建了一个数据帧(只是为了保持简单):

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

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

如果我选择了一些BEGINNING WITH FIRST行的行,我会得到某种数据帧的子集,例如:

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变量?我知道我之后可以删除它但也许从一开始就可以避免它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

它从原始数据集中复制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