如何根据分组变量从R中的数据帧中删除每第n行?

时间:2016-08-08 05:50:29

标签: r

我希望根据分组变量从data.frame中进行每秒测量。例如,在data.frame Input中,为每个Sample每隔一秒ID

 head(Input, 10)
           Sample    X       ID
    15918      1 -1.326285 EABE_D5
    15919      2 -1.315783 EABE_D5
    15920      3 -1.313245 EABE_D5
    15921      4 -1.304670 EABE_D5
    15922      5 -1.309060 EABE_D5
    15923      1 -1.292412 EABE_D4
    15924      2 -1.294728 EABE_D4
    15925      3 -1.282006 EABE_D4
    15926      4 -1.287245 EABE_D4
    15927      5 -1.278444 EABE_D4

并创建一个名为Output的新data.frame:

Output
        Sample   X       ID
15919      2 -1.315783 EABE_D5
15921      4 -1.304670 EABE_D5
15924      2 -1.294728 EABE_D4
15926      4 -1.287245 EABE_D4

这可能吗?谢谢。

2 个答案:

答案 0 :(得分:2)

我们可以使用dplyr。按照' ID'进行分组后,我们根据slice

返回的偶数索引seq
library(dplyr)
Input %>%
   group_by(ID) %>%
   slice(seq(2, n(), by =2))
#  Sample         X      ID
#   <int>     <dbl>   <chr>
#1      2 -1.294728 EABE_D4
#2      4 -1.287245 EABE_D4
#3      2 -1.315783 EABE_D5
#4      4 -1.304670 EABE_D5

或者我们可以使用data.table来提高效率

library(data.table)
setDT(Input)[Input[, .I[seq(2, .N, by = 2)], by = ID]$V1]

或者使用ave中的base R,我们按“ID&#39;分组”,将模数运算符%%与y一起应用为2,通过否定转换为逻辑({ {1}})并使用此逻辑向量,我们对行进行子集化。

!

答案 1 :(得分:0)

这可能效率低下。但是,您可以使用lapply

以另一种方式执行此操作
do.call(rbind, lapply(split(df, df$ID), function(x) x[seq(2, nrow(x), by=2),]))


#                Sample   X      ID
#EABE_D4.15924      2 -1.294728 EABE_D4
#EABE_D4.15926      4 -1.287245 EABE_D4
#EABE_D5.15919      2 -1.315783 EABE_D5
#EABE_D5.15921      4 -1.304670 EABE_D5

split根据ID对数据框进行选择,然后选择每个组中的每一行,最后rbind使用do.call转换为数据帧返回的列表。

如果您不想要行名称,可以将数据帧放在一个变量中(比如说a),然后

rownames(a) <- NULL