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

des*_*hen 6 row r dataframe

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

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

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

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

testframe2 <- testframe[1:2,] #selecting the first two rows
Run Code Online (Sandbox Code Playgroud)

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

testframe3 <- testframe[3:4,] #selecting the last two rows
Run Code Online (Sandbox Code Playgroud)

导致:

  a b
3 3 7
4 4 8
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能首先阻止新的row.names变量?我知道我之后可以删除它但也许从一开始就可以避免它.

谢谢你的帮助!

Sim*_*lon 4

row.names从原始数据集中复制 。rownames<-只需使用如下命令重命名行...

rownames( testframe3 ) <- seq_len( nrow( testframe3 ) )
#   a b
# 1 3 7
# 2 4 8
Run Code Online (Sandbox Code Playgroud)

首选以编程方式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
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过将子集包装在调用中来完成此操作data.frame,但如果您想以编程方式导出行数(因为您必须子集两次),那么这实际上效率很低,并且我不推荐使用该方法rownames<-

data.frame( testframe[3:4,] , row.names = 1:2 )
#  a b
#1 3 7
#2 4 8
Run Code Online (Sandbox Code Playgroud)

  • 或者只是 `rownames( testframe3 ) &lt;- NULL` (7认同)