首页 > 解决方案 > 删除组内最后一次出现值后的所有行

问题描述

我有一个带有 ID 和工作日 (1-7) 的大型(500,000 行)数据集,我想在所有 ID 的工作日编号 7 最终出现之后删除所有行。

这是一个简化的例子。

数据集:

df <- structure(list(A = structure(c(1L, 1L, 1L, 1L,1L,1L,1L,1L,1L,1L,1L,1L,1L, 2L, 2L, 2L, 2L, 2L,2L,2L,2L,2L, 3L, 3L, 3L,3L,3L,3L), 
                                   .Label = c("a", "b", "c"), class = "factor"),
                     B = c(1L, 7L, 1L, 1L, 2L, 7L, 1L, 2L, 3L, 1L, 2L, 7L,1L, 7L, 1L, 1L, 2L, 7L, 1L, 2L, 3L, 1L, 2L, 7L,1L, 1L, 2L, 7L)), 
                .Names = c("ID","Weekday"), 
                class = "data.frame", 
                row.names = c(NA, -28L))

此代码在此简化数据集上完美运行:

df.out<-df %>% 
  group_by(ID)%>%
  dplyr::slice(1:max(which(Weekday == "7")))

但是当我在我的大型数据集上尝试它时,我收到以下错误:

Error in 1:max(which(weekday == "7")) : result would be too long a vector
In addition: Warning message:
In max(which(weekday == "7")) :
  no non-missing arguments to max; returning -Inf

我曾尝试将工作日作为数字、因子和整数,但没有运气。

我似乎无法在适合此平台的简化数据集中重现此错误,因此我不确定如何进一步演示它,但对于如何解决此错误的任何帮助将不胜感激!

我在大型数据集上使用了类似的代码,在第一次出现之前删除了所有行,没有问题。例如

df.out<-df %>% 
 group_by(ID)%>%
 dplyr::slice(which.max(weekday == "1") : n())

标签: rdplyr

解决方案


ID如果您的其中没有 7,则可以重现该错误。

library(dplyr)

df <- rbind(df, data.frame(ID = 'd', Weekday = 1))

df %>% 
    group_by(ID)%>%
    slice(1:max(which(Weekday == "7")))

1:max(which(Weekday == "7")) 中的错误:结果向量太长

解决方案是检查您是否至少出现一次 7。

df %>% 
  group_by(ID)%>%
  slice(if(any(Weekday == 7)) 1:max(which(Weekday == 7)) else 0) %>%
  ungroup

#   ID    Weekday
#   <fct>   <dbl>
# 1 a           1
# 2 a           7
# 3 a           1
# 4 a           1
# 5 a           2
# 6 a           7
# 7 a           1
# 8 a           2
# 9 a           3
#10 a           1
# … with 13 more rows

推荐阅读