以不均匀的步骤将函数应用于数据框

applying function to data frame in uneven steps

我有一个数据框记录了第 2 列中第 1 列中一组样本的重复测量值 (X4),以及第 3 列中重复测量的次数 - 'rep'。

head(df1)
       col1    col2    rep
1      AE01    0.20      1
2      AE01    0.28      2
3      AE01    0.52      3
4      AE01    0.02      4
5      AE02    0.19      1
6      AE02    0.40      2

我想制作一个新的 matrix/data 框架,以获取每个四组重复测量的四个重复中的每一个的平均值。我的尝试如下:

df2<-cbind(unique(df1$col1), apply(df1$col2[seq(1, length(df1$col2), 4)], 1, mean))

我收到以下错误:

Error in apply(df1$col2[seq(1, length(df1$col2), 4)], 1, mean) : 
  dim(X) must have a positive length

这可能是因为我之前必须使用 'na.omit' 从数据集中删除 NA 值,因此第 1 列中记录的每个样本可能没有 4 个重复...

如果每个样本的步长不均匀,我如何获得每个样本的平均值?

预期输出:

     sample     calculated_average_of_each_quadruplet_of_col2_values    
1      AE01                                                     0.255      
2      AE02                                                     0.295      

对于 data.table 我的方法是

library(data.table)
setDT(df1) # convert to data table by reference
df1[, .(mean_col2 = mean(col2, na.rm = TRUE)), by = col1]

结果:

   col1 mean_col2
1: AE01     0.255
2: AE02     0.295

无需进一步导入,这可以使用许多包含的函数来完成,例如 tapply 或 aggregate:

aggregate(df1$col2, by=list(df1$col1), function(x) mean(x, na.rm=TRUE))

结果

  Group.1     x
1    AE01 0.255
2    AE02 0.295

如果您想要向量或列表作为结果,请使用 tapply

> tapply(df1$col2, df1$col1, function(x) mean(x, na.rm=TRUE))
 AE01  AE02 
0.255 0.295 

我们可以使用dplyr

library(dplyr)
df1 %>%
    group_by(col1) %>%
    summarise(mean_col2 = mean(col2, na.rm = TRUE))
#   col1 mean_col2
#  <chr>     <dbl>
#1  AE01     0.255
#2  AE02     0.295