删除具有任意行数的数据框中的最后 N 行
Posted
技术标签:
【中文标题】删除具有任意行数的数据框中的最后 N 行【英文标题】:Remove last N rows in data frame with the arbitrary number of rows 【发布时间】:2014-02-04 13:49:08 【问题描述】:我有一个数据框,我想从中删除最后 N 行。 如果我想删除 5 行,我目前使用以下命令,我认为该命令相当复杂:
df<- df[-seq(nrow(df),nrow(df)-4),]
你将如何完成任务,我可以在 R 中使用一个方便的函数吗?
在 unix 中,我会使用:
tac file | sed '1,5d' | tac
【问题讨论】:
在 unix 中,我会使用:head -n -5 file
【参考方案1】:
head
带有负数索引很方便...
df <- data.frame( a = 1:10 )
head(df,-5)
# a
#1 1
#2 2
#3 3
#4 4
#5 5
附言您的seq()
示例可能会使用命名参数by
和length.out
(缩短为len
)写得稍微少一些(?),就像-seq(nrow(df),by=-1,len=5)
一样。
【讨论】:
有一个边缘案例!head(df, -0) == head(df,0) != df
@peer 抱歉,我不认为我理解您的评论。你能更全面地说明边缘情况吗?
我正在从 df[0:(nrow(df)-n),]
切换到 head
。在我的例子中,用户移动一个滑块来指示n
最后一行将被删除。但是有一个问题!当用户设置n=0
时,我们预计不会删除任何行。但是对于head(df, -n)
,所有行都将被删除,因为负零被解析为正零-> 取前 0 行。所以我想警告其他动态设置n
并允许n=0
的人:你需要if (n > 0) df=head(df, -n)
【参考方案2】:
这一行多出一行,但可读性更强:
n<-dim(df)[1]
df<-df[1:(n-5),]
当然,您可以通过将dim
命令直接粘贴到重新分配语句中来在一行中完成。
我认为这是可重现脚本的一部分,您可以追溯您的步骤...否则,强烈建议在这种情况下保存到不同的变量(例如,df2
),然后仅在您删除冗余副本之后确定你得到了你想要的。
【讨论】:
虽然head
解决方案可能更可取,但您也可以使用nrow(df)
而不是dim(df)[1]
。
基于您的建议的直观单行:d <- d[1:(nrow(d)-5),]
这个解决方案实际上为我删除了数据框的行名,而接受的答案(使用head()
)没有,所以我不推荐这个选项。【参考方案3】:
添加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
【讨论】:
【参考方案4】:另一个更易读的dplyr
答案:
df %>% filter(row_number() <= n()-5)
【讨论】:
以上是关于删除具有任意行数的数据框中的最后 N 行的主要内容,如果未能解决你的问题,请参考以下文章
pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)