如何在R语言中为分组的最后一行赋值?
实现方法
下面提供几种在R中按ID分组并标记每组最后一行的方案:
1. Base R 方法
无需加载额外包,使用ave()函数实现:
a$end.spell <- with(a, ave(seq_along(ID), ID, FUN = function(x) as.integer(seq_along(x) == length(x))))
seq_along(ID)生成每行的索引- 按
ID分组后,判断组内当前行位置是否等于组的总行数,满足则返回1,否则返回0
2. dplyr 方法
适合使用tidyverse生态的用户:
library(dplyr) a <- a %>% group_by(ID) %>% mutate(end.spell = as.integer(row_number() == n())) %>% ungroup()
group_by(ID)按ID分组row_number()获取组内行号,n()获取组的总行数,两者相等即为最后一行,转成整数得到1/0标记
3. data.table 方法
处理大数据集时效率更高:
library(data.table) setDT(a)[, end.spell := as.integer(.I == .N), by = ID]
setDT(a)将数据框转为data.table格式.I表示全局行号,.N表示每组的行数,按ID分组后判断是否为组内最后一行
执行任意一种方法后,你的数据框都会生成期望的end.spell列,结果如下:
ID NUM VAL end.spell 1 A 1 1 0 2 A 2 0 1 3 B 4 1 0 4 B 3 0 1 5 C 6 1 0 6 C 9 0 1
内容的提问来源于stack exchange,提问作者aerw4
相关产品推荐
相关产品推荐

