根据其他变量删除行的子集。

问题描述 投票:0回答:1

我按照这个例子 删除数据框中的最后N条任意行数的记录。 但它只是删除了数据框的最后50行,而不是数据框内每个研究点的最后50行。我有一个非常大的数据集,它有多个研究站点,每个研究站点内有多个深度,每个深度都有一个营养物浓度。

我想只删除每个站点的最后50行深度。

例如:1号站有250个深度 2号站有1000个深度 3号站有150个深度。

但保持所有其他数据的一致性。

这似乎只是从数据框中删除了最后50个数据,而不是每个站的最后50个数据......。

 df<- df[-seq(nrow(df),nrow(df)-50),]

我应该怎么做才能添加更多的变量(研究站点)来过滤?

r dataframe row
1个回答
2
投票

一个潜在的基础R解决方案将是。

d <- data.frame(station = rep(paste("station", 1:3), c(250, 1000, 150)),
                depth = rnorm(250 + 1000 + 150, 100, 10))

d$grp_counter <- do.call("c", lapply(tapply(d$depth, d$station, length), seq_len))
d$grp_length <- rep(tapply(d$depth, d$station, length), tapply(d$depth, d$station, length))
d <- d[d$grp_counter <= (d$grp_length - 50),]
d

# OR w/o auxiliary vars: subset(d, select = -c(grp_counter, grp_length))

1
投票

我们可以使用 slice 功能从 dplyr 包裹

df2<-df %>% group_by(Col1) %>% slice(1:(n()-4))

首先,它按类别列进行分组,如果按适当的顺序排列,它可以从数据框中删除每个类别的最后n行数(在本例中为4行)。

© www.soinside.com 2019 - 2024. All rights reserved.