r - 根据列值保留前几个重复项
问题描述
我有一个包含 5 列的时间序列数据。第一列是用户名,其余是不同时间点的值。此处显示的示例数据 - https://pastebin.com/raw/TzmhKybt
我想保留任何给定用户的前 3 个值,并删除其余的值。因此,对于每个给定的用户,数据集中最多有 3 条记录。我尝试了以下方法,但似乎不起作用。请指出我正确的方向,因为我找不到任何好的方法来做到这一点。
data %>% group_by(User) %>% top_n(3)
的输出dput(data[1:10,])
是
structure(list(User = c("mmcclafl", "mmcclafl", "mmcclafl", "mmcclafl",
"mmcclafl", "mmcclafl", "gsnabwez", "gsnabwez", "gsnabwez", "gsnabwez"
), StartTime = c(584.93, 584.93, 584.93, 584.93, 584.93, 584.93,
1501.26, 1501.26, 1501.26, 1501.26), Time = c(597.94, 675.28,
774.02, 843.05, 1093.79, 1142.85, 1510.94, 1582.81, 1665.26,
1689.91), SelfReport = c("FLOW", "FLOW", "FLOW", "FRUSTRATION",
"FRUSTRATION", "FRUSTRATION", "FLOW", "FRUSTRATION", "FRUSTRATION",
"FRUSTRATION"), Affectiva = c("BOREDOM", "BOREDOM", "BOREDOM",
"BOREDOM", "BOREDOM", "BOREDOM", "BOREDOM", "BOREDOM", "OTHER",
"BOREDOM")), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L, 10L,
11L), class = "data.frame")
解决方案
您可以通过执行为每个组选择前 3 行。
使用dplyr
library(dplyr)
data %>% group_by(User) %>% slice(1:3)
# User StartTime Time SelfReport Affectiva
# <chr> <dbl> <dbl> <chr> <chr>
#1 gsnabwez 1501. 1511. FLOW BOREDOM
#2 gsnabwez 1501. 1583. FRUSTRATION BOREDOM
#3 gsnabwez 1501. 1665. FRUSTRATION OTHER
#4 mmcclafl 585. 598. FLOW BOREDOM
#5 mmcclafl 585. 675. FLOW BOREDOM
#6 mmcclafl 585. 774. FLOW BOREDOM
在基础 R
subset(data, ave(StartTime, User, FUN = seq_along) <= 3)
并且在data.table
library(data.table)
setDT(data)[, .SD[1:3], by=User]
推荐阅读
- c - 将pointer-to-char转换为pointer-to-int后意外的字节顺序
- macos - CMake添加MacOSX框架的正确方法
- typescript - 打字稿使用键作为字符串的限制
- python - 将 NaN 替换为 pandas 数据框中早晚 X 行的值
- javascript - 获取包含由一个或多个逗号分隔的电子邮件地址的字符串
- android - 使用分页架构组件调试分页
- database-administration - ArangoDB 按需压缩文件空间回收的最佳实践
- javascript - 不变违规:元素类型无效:期望字符串或类/函数,但得到:对象。检查渲染方法
- python - 多步预测 LSTM 模型
- java - 在 DropWizard 中禁用 Swagger Bundle