如何插入一行来计算它上面行的平均值?

时间:2018-02-05 20:55:40

标签: r

我希望通过Cue分隔数据行并添加一行来计算每个主题的平均值。这是一个例子:

在:

    Cue ITI    a       b       c
1   0   16  0.82062 0.52185 0.27679
2   0   24  0.53894 0.49957 0.35767
3   4   22  0.26855 0.17487 0.22461
4   4   20  0.15106 0.48767 0.49072
5   7   18  0.11627 0.12604 0.2832
6   7   24  0.50201 0.14252 0.21454
7   12  16  0.27649 0.96008 0.42114
8   12  18  0.60852 0.21637 0.18799
9   22  20  0.32867 0.65308 0.29388
10  22  24  0.25726 0.37048 0.32379

后:

    Cue ITI    a       b       c
1   0   16  0.82062 0.52185 0.27679
2   0   24  0.53894 0.49957 0.35767
3           0.67978 0.51071 0.31723
4   4   22  0.26855 0.17487 0.22461
5   4   20  0.15106 0.48767 0.49072
6           0.209   0.331   0.357
7   7   18  0.11627 0.12604 0.2832
8   7   24  0.50201 0.14252 0.21454
9           0.309   0.134   0.248
10  12  16  0.27649 0.96008 0.42114
11  12  18  0.60852 0.21637 0.18799
12          0.442   0.588   0.304
13  22  20  0.32867 0.65308 0.29388
14  22  24  0.25726 0.37048 0.32379
15          0.292   0.511   0.308

因此在“after”示例中,第3行是第1行和第2行的平均值(第6行是第4行和第5行的平均值等)。

非常感谢任何帮助/信息! 谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用base r执行以下操作:

 Reduce(rbind,by(data,data[1],function(x)rbind(x,c(NA,NA,colMeans(x[-(1:2)])))))
   Cue ITI        a        b        c
1    0  16 0.820620 0.521850 0.276790
2    0  24 0.538940 0.499570 0.357670
3   NA  NA 0.679780 0.510710 0.317230
32   4  22 0.268550 0.174870 0.224610
4    4  20 0.151060 0.487670 0.490720
31  NA  NA 0.209805 0.331270 0.357665
5    7  18 0.116270 0.126040 0.283200
6    7  24 0.502010 0.142520 0.214540
33  NA  NA 0.309140 0.134280 0.248870
7   12  16 0.276490 0.960080 0.421140
8   12  18 0.608520 0.216370 0.187990
34  NA  NA 0.442505 0.588225 0.304565
9   22  20 0.328670 0.653080 0.293880
10  22  24 0.257260 0.370480 0.323790
35  NA  NA 0.292965 0.511780 0.308835

答案 1 :(得分:1)

这是一个想法。拆分数据框,执行分析,然后将它们组合在一起。

DF_list <- split(DF, f = DF$Cue)

DF_list2 <- lapply(DF_list, function(x){
  df_temp <- as.data.frame(t(colMeans(x[, -c(1, 2)])))
  df_temp[, c("Cue", "ITI")] <- NA
  df <- rbind(x, df_temp)
  return(df)
})

DF2 <- do.call(rbind, DF_list2)
rownames(DF2) <- 1:nrow(DF2)
DF2
#    Cue ITI        a        b        c
# 1    0  16 0.820620 0.521850 0.276790
# 2    0  24 0.538940 0.499570 0.357670
# 3   NA  NA 0.679780 0.510710 0.317230
# 4    4  22 0.268550 0.174870 0.224610
# 5    4  20 0.151060 0.487670 0.490720
# 6   NA  NA 0.209805 0.331270 0.357665
# 7    7  18 0.116270 0.126040 0.283200
# 8    7  24 0.502010 0.142520 0.214540
# 9   NA  NA 0.309140 0.134280 0.248870
# 10  12  16 0.276490 0.960080 0.421140
# 11  12  18 0.608520 0.216370 0.187990
# 12  NA  NA 0.442505 0.588225 0.304565
# 13  22  20 0.328670 0.653080 0.293880
# 14  22  24 0.257260 0.370480 0.323790
# 15  NA  NA 0.292965 0.511780 0.308835

数据

DF <- read.table(text = "    Cue ITI    a       b       c
1   0   16  0.82062 0.52185 0.27679
                 2   0   24  0.53894 0.49957 0.35767
                 3   4   22  0.26855 0.17487 0.22461
                 4   4   20  0.15106 0.48767 0.49072
                 5   7   18  0.11627 0.12604 0.2832
                 6   7   24  0.50201 0.14252 0.21454
                 7   12  16  0.27649 0.96008 0.42114
                 8   12  18  0.60852 0.21637 0.18799
                 9   22  20  0.32867 0.65308 0.29388
                 10  22  24  0.25726 0.37048 0.32379", header = TRUE)

答案 2 :(得分:1)

采用data.table方法,但如果有人可以提供一些改进,我会很乐意听到。

library(data.table)

dt <- data.table(df)

dt2 <- dt[, lapply(.SD, mean), by = Cue][,ITI := NA][]
data.table(rbind(dt, dt2))[order(Cue)][is.na(ITI), Cue := NA][]

> data.table(rbind(dt, dt2))[order(Cue)][is.na(ITI), Cue := NA][]
    Cue ITI        a        b        c
 1:   0  16 0.820620 0.521850 0.276790
 2:   0  24 0.538940 0.499570 0.357670
 3:  NA  NA 0.679780 0.510710 0.317230
 4:   4  22 0.268550 0.174870 0.224610
 5:   4  20 0.151060 0.487670 0.490720
 6:  NA  NA 0.209805 0.331270 0.357665

如果您想将Cue值保持原样以确认组,只需从最后一行删除[is.na(ITI), Cue := NA]

答案 3 :(得分:0)

我会使用group_by包中的summariseDPLYR来获取具有平均值的数据框。然后使用旧数据框对新数据框进行rbind并按Cue排序:

df_averages <- df_orig >%>
  group_by(Cue) >%>
  summarise(ITI = NA, a = mean(a), b = mean(b), c = mean(c)) >%>
  ungroup()

df_all <- rbind(df_orig, df_averages)