假设我创建了一个数据帧(只是为了保持简单):
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变量?我知道我之后可以删除它但也许从一开始就可以避免它。
感谢您的帮助!
答案 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