[英]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.