我希望根据分组变量从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
这可能吗?谢谢。
答案 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