在R中的数据集中的列上循环

时间:2018-10-17 13:36:45

标签: function for-loop sapply

我有一个数据集,看起来像我用以下代码创建的数据集:

cluster <- rep(c(1,1,1,2,2,1,3,3,2,3,3))
measure_t1 <- rep(c(4.3, 4.7, 4.5, 3.4, 3.3, 4.7, 2.2, 2.1, 3.6, 2.2, 2.2))
measure_t2 <- rep(c(4.0, 4.1, 4.2, 3.5, 3.5, 4.6, 2.1, 2.4, 3.7, 2.3, 2.2))
measure_t3 <- rep(c(4.3, 4.2, 4.9, 3.8, 3.5, 4.3, 2.2, 2.8, 3.8, 2.7, 2.4))
df <- data.frame(cluster=cluster, measure_t1=measure_t1, measure_t2=measure_t2, 
measure_t3=measure_t3)

因此,我对在三个不同位置(三个“群集”)中的三个不同样本场合进行的相同变量的度量进行了测量,并在该位置进行了重复。

我基本上想在数据集中添加三列,其中每个新列包含给定样本时机每个聚类的平均值。换句话说,新列“ mean_t1”应包含每次群集== 1时群集1的measure_t_1平均值,每次群集== 2时群集2的measure_t1平均值以及每次群集3的measure_t1平均值集群== 3 我要对measure_t2和measure_t3进行同样的操作。

使用以下代码我没有问题:

mean_t1 <- sapply(df$cluster, function(x) if(x==1) mean(df$measure_t1[df$cluster==1])
   else if(x==2) mean(df$measure_t2[df$cluster==2])
   else if(x==3) mean(df$measure_t2[df$cluster==3]))

当然,我可以使用相同的代码来创建mean_t2和mean_t3,但是我的实际数据集包含许多列,这变得很耗时。

因此,我想以循环方式或通过将函数应用到不同的列来迭代地执行此操作,但是我没有进行管理。

1 个答案:

答案 0 :(得分:1)

我们可以使用 dplyr 和常规的 tidyverse 套件以最小的重复次数完成此操作。在这里,我们将每个聚类分组并计算每个非分组列的平均值。然后重命名列,并加入到原始数据集。

library(tidyverse)

df.means <- df %>% 
  group_by(cluster) %>% 
  mutate_all(mean)

colnames(df.means) <- gsub('measure', 'mean', colnames(df.means))

df.final <- bind_cols(df, df.means)

   cluster measure_t1 measure_t2 measure_t3 cluster1  mean_t1  mean_t2 mean_t3
1        1        4.3        4.0        4.3        1 4.550000 4.225000   4.425
2        1        4.7        4.1        4.2        1 4.550000 4.225000   4.425
3        1        4.5        4.2        4.9        1 4.550000 4.225000   4.425
4        2        3.4        3.5        3.8        2 3.433333 3.566667   3.700
5        2        3.3        3.5        3.5        2 3.433333 3.566667   3.700
6        1        4.7        4.6        4.3        1 4.550000 4.225000   4.425
7        3        2.2        2.1        2.2        3 2.175000 2.250000   2.525
8        3        2.1        2.4        2.8        3 2.175000 2.250000   2.525
9        2        3.6        3.7        3.8        2 3.433333 3.566667   3.700
10       3        2.2        2.3        2.7        3 2.175000 2.250000   2.525
11       3        2.2        2.2        2.4        3 2.175000 2.250000   2.525