R数据帧中行的子集

时间:2019-08-14 08:37:38

标签: r

我目前正在从网上抓取一些数据,数据示例如下:

    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行?除了遍历每一行,我想不出一种有效的方法。

3 个答案:

答案 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()