从dplyr到base:为变量的每个级别创建第一个和最后一个索引的数据框
问如何从dplyrtobase可能是一个奇怪的问题,尤其是因为我喜欢tidyverse,但我认为因为我学习了tidyverse第一个,我对基础的掌握还很不熟练,我需要一个base解决方案,因为我正在帮助开发这个包不想要任何tidyverse依赖
数据(还有更多的列,但为了 reprex 的缘故而缩写):
sample.df <- tibble(batch = rep(c(1,2,3), c(4,5,6)))
期望基数相当于:
sample.df %>%
mutate(rowid = row_number()) %>%
group_by(batch) %>%
summarize(idx_b = min(rowid),
idx_e = max(rowid))
# A tibble: 3 x 3
# Groups: batch [3]
batch idx_b idx_e
<dbl> <int> <int>
1 1 1 4
2 2 5 9
3 3 10 15
回答
我们在数据中创建一个序列列,用于aggregate获取range或min/max并将矩阵列转换为常规 data.frame 列do.call
out <- do.call(data.frame, aggregate(rowid ~ batch,
transform(sample.df, rowid = seq_len(nrow(sample.df))),
FUN = function(x) c(b = min(x), e = max(x))))