我目前正在从网上抓取一些数据,数据示例如下:
col_a | col_b | col_c | col_d
1 | 2 | 44 | home1
1 | 3 | 44 | home1
1 | 7 | 44 | home1
1 | 5 | 44 | home1
1 | 2 | 44 | home1
1 | 3 | 44 | home1
1 | 7 | 44 | home1
1 | 5 | 44 | home1
2 | 8 | 42 | home1
2 | 6 | 42 | home1
2 | 4 | 42 | home1
2 | 1 | 42 | home1
如上面的示例所示,总共有12行。假定正确的数据只有8行数据,以“ col_a”为参考,每个唯一的“ col_a”应该只有4行。因此,在这种情况下,第5至8行是第1至4行的重复项。也就是说,抓取的数据超过100,000行,并且这些重复项在各处发生。有没有办法只保留每个唯一“ col_a”的前4行?除了遍历每一行,我想不出一种有效的方法。
答案 0 :(得分:1)
您可以通过以下方式在col_a中获取不同的值:
col_a_unique <- unique(data$col_a)
然后最终在其上循环并仅保留每个前四个:
for (a in col_a_unique)
{
to_keep=data[which(data$col_a==a),][1:4]
}
wihch()
将仅选择满足相等条件的行,即与col_a上给定值相对应的所有元素,然后使用[1:4]
选择前四个元素。
然后,您需要在每个循环步骤中创建一个适当的对象来存储to_keep
。
这是一种详细的方法,还有更简洁的方法。
答案 1 :(得分:0)
应该为此作弊,但由于找不到人,我将写下一个答案。
使用dplyr
,我们可以做到
library(dplyr)
df %>% group_by(col_a) %>% slice(1:4)
# col_a col_b col_c col_d
# <int> <int> <int> <fct>
#1 1 2 44 home1
#2 1 3 44 home1
#3 1 7 44 home1
#4 1 5 44 home1
#5 2 8 42 home1
#6 2 6 42 home1
#7 2 4 42 home1
#8 2 1 42 home1
使用data.table
library(data.table)
setDT(df)[, .SD[1:4], by = col_a]
和基数R
df[with(df, ave(col_b, col_a, FUN = seq_along) <= 4), ]
答案 2 :(得分:0)
在R
的{{1}}的帮助下,以data.table
为基础:
rowid()