我有一个数据帧,其中一个因子具有不同数量的行数.我想删除每个因素级别的最后2行. test<-data.frame(id=c(1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3), val=c(3,5,4,6,7,4,1,6,7,8,4,2,0,3,6,8,1,2), trt=c(1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2))

结果应该是这样的:

   id val trt
1   1   3   1
2   1   5   1
3   1   4   1
4   2   4   1
5   2   1   1
6   2   6   1
7   2   7   1
8   3   2   2
9   3   0   2
10  3   3   2
11  3   6   2
12  3   8   2

另外,我还需要在数据框中保留各种其他列.我编辑了示例df以包括另一个与本练习无关的因子,但我确实需要它(以及更多)用于将来的计算.

推荐答案

使用data.table:

library(data.table)

setDT(test)[,.(val = val[1:(.N - 2)]), id][]
#>     id val
#>  1:  1   3
#>  2:  1   5
#>  3:  1   4
#>  4:  2   4
#>  5:  2   1
#>  6:  2   6
#>  7:  2   7
#>  8:  3   2
#>  9:  3   0
#> 10:  3   3
#> 11:  3   6
#> 12:  3   8

或者,如果有其他列,则使用.SD:

setDT(test)[,.SD[1:(.N - 2)], id][]
#>     id val trt
#>  1:  1   3   1
#>  2:  1   5   1
#>  3:  1   4   1
#>  4:  2   4   1
#>  5:  2   1   1
#>  6:  2   6   1
#>  7:  2   7   1
#>  8:  3   2   2
#>  9:  3   0   2
#> 10:  3   3   2
#> 11:  3   6   2
#> 12:  3   8   2

请注意,如果数据尚未按id分组,这将相对于原始数据重新排列数据.

基数R(如果testid排序):

test[sequence((n <- rle(test$id)[[1]]) - 2, c(1, cumsum(n[-length(n)]) + 1)),]
#>     id val trt
#>  1:  1   3   1
#>  2:  1   5   1
#>  3:  1   4   1
#>  4:  2   4   1
#>  5:  2   1   1
#>  6:  2   6   1
#>  7:  2   7   1
#>  8:  3   2   2
#>  9:  3   0   2
#> 10:  3   3   2
#> 11:  3   6   2
#> 12:  3   8   2

R相关问答推荐

有没有方法将琴弦完全捕捉到R中的多边形?

查找具有平局的多个列的最大值并返回列名或平局 destruct 者NA值

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

在数学中正确显示摄氏度、开氏度或华氏度

将非重复序列高效转换为长格式

单个轮廓重叠条的单独图例

R根据条件进行累积更改

使用across,starts_with和ifelse语句变更多个变量

使用rest从header(h2,h3,table)提取分层信息

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

仅在Facet_WRAP()中的相应方面包含geom_abline()

条形图顶部与其错误条形图不对齐

为左表中的所有行使用值Fill滚动左连接

如何使用同比折线图中的个别日

如何使用For-R循环在向量中找到一系列数字

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

是什么打破了此Quarto仪表板中的工具提示?

如何计算多个变量的百分比与总和的百分比?

如何准确地指出Read_delim所面临的问题?

如何修改Rust中的R字符串并将其赋给新的R变量,并使用extendr保留原始R字符串