使用任意行数删除数据框中的最后N行

Alb*_*lby 36 row r dataframe

我有一个数据框,我想从中删除最后N行.如果我想删除5行,我目前使用以下命令,在我看来这是相当复杂的:

df<- df[-seq(nrow(df),nrow(df)-4),]
Run Code Online (Sandbox Code Playgroud)

你将如何完成任务,是否有一个方便的功能,我可以在R中使用?

在unix中,我会使用:

tac file | sed '1,5d' | tac 
Run Code Online (Sandbox Code Playgroud)

Sim*_*lon 64

head 负指数对此方便...

df <- data.frame( a = 1:10 )
head(df,-5)
#  a
#1 1
#2 2
#3 3
#4 4
#5 5
Run Code Online (Sandbox Code Playgroud)

ps你的seq()例子可能写得稍微少些(?)使用命名参数bylength.out(缩写为len)这样的笨拙-seq(nrow(df),by=-1,len=5).

  • 我正在从 `df[0:(nrow(df)-n),]` 切换到 `head`。在我的例子中,用户移动一个滑块来指示要删除最后一行“n”。但是有一个问题!当用户设置 `n=0` 时,我们希望不会删除任何行。但是使用 `head(df, -n)` 会删除所有行,因为负零被解析为正零 -&gt; 取前 0 行。所以我想警告其他动态设置 `n` 并允许 `n=0` 的人:你需要 `if (n &gt; 0) df=head(df, -n)` (4认同)

小智 14

这一行需要多一行,但更具可读性:

n<-dim(df)[1]
df<-df[1:(n-5),]
Run Code Online (Sandbox Code Playgroud)

当然,您可以通过将dim命令直接粘贴到重新赋值语句中来完成一行.我认为这是一个可重现的脚本的一部分,你可以回溯你的步骤......否则,强烈建议在这种情况下保存到一个不同的变量(例如df2),然后只有在你确定你得到之后才删除冗余副本你想要什么.

  • 虽然`head`解决方案可能更可取,但您也可以使用`nrow(df)`而不是`dim(df)[1]`. (4认同)
  • 基于您的建议的直观单行:``d &lt;- d[1:(nrow(d)-5),]`` (3认同)

Edg*_*gar 8

另一个dplyr更具可读性的答案:

df %>% filter(row_number() <= n()-5)
Run Code Online (Sandbox Code Playgroud)


小智 6

添加dplyr完整性的答案:

test_df <- data_frame(a = c(1,2,3,4,5,6,7,8,9,10), 
                      b = c("a","b","c","d","e","f","g","h","i","j"))
slice(test_df, 1:(n()-5))

## A tibble: 5 x 2
#      a b    
#  <dbl> <chr>
#1     1 a    
#2     2 b    
#3     3 c    
#4     4 d    
#5     5 e    
Run Code Online (Sandbox Code Playgroud)