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