繁体   English   中英

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

[英]How can I delete every n-th row from a dataframe in R, according to grouping variable?

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

 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

这可能吗? 谢谢。

我们可以使用dplyr 按“ ID”分组后,我们根据seq返回的偶数索引对行进行slice

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]

或使用base R ave ,将“ ID”分组,应用y等于2的取模运算符%% ,通过取反( ! )转换为逻辑,并使用此逻辑向量对行进行子集化。

Input[with(Input, !ave(Sample, ID, FUN = function(x) x %%2)),]
#      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

这可能效率不高。 但是,您可以使用lapply以另一种方式执行此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 ,然后各组在选择每2行和最后rbind使用荷兰国际集团他们do.call转换列表中返回的数据帧。

如果您不希望使用行名,则可以将数据框放在一个变量中(例如a),然后

rownames(a) <- NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM