在不均匀的步骤中将功能应用于数据帧

时间:2016-08-01 19:58:32

标签: r aggregate apply

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

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

我想制作一个新的矩阵/数据框,它可以获得每个复制测量四个重复的四个重复项的平均值。我的尝试如下:

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

这可能是因为我必须使用&#39; na.omit&#39;从数据集中删除NA值。较早,因此第1栏中记录的每个样品可能不会有4个重复...

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

预期产出:

     sample     calculated_average_of_each_quadruplet_of_col2_values    
1      AE01                                                     0.255      
2      AE02                                                     0.295      

3 个答案:

答案 0 :(得分:2)

使用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

结果:

df[np.where(df['Count']==1)[0][0]:]

答案 1 :(得分:2)

如果没有进一步的导入,可以使用许多包含的函数来完成,例如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 

答案 2 :(得分:2)

我们可以使用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