r - 删除组内最后一次出现值后的所有行
问题描述
我有一个带有 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())
解决方案
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
推荐阅读
- c# - 在 ASP .Net Core 3.0 项目中延迟获取工作线程
- asp.net-core - 如何将 asp-page-handler 动态添加到在 asp.net 核心中标记?
- mongoose - 删除请求有效,但不会从数据库中删除
- flutter - 如何使用颤振从 BottomNavigationBar 获取类似 WhatsApp 的菜单?
- python - Python - 构建一个二维随机整数列表,显示重复,不应该存在
- node.js - 在 Mocha 测试中无法通过 graphql.macro 加载器检索 GraphQL 架构
- mysql - 在 MySQL/MariaDB 的事务中读取提交的数据
- html - 导航(菜单栏)下方的内容流:响应式网站
- javascript - InnerHTML 标记在我的 JavaScript 代码中不起作用
- php - 错误:遇到未捕获的异常