循环和创建新列

时间:2018-03-26 17:18:18

标签: r loops mean

假设我的数据框中有几列,它们来自一系列类似的因素:

例如:A1_Factor1A1_Factor2A1_Factor3B1_Factor1B1_Factor2C1_Factor1

我想要的是使用此数据创建其他列。所以:

  • A1_Mean - 这应该是以A1

  • 开头的列的平均值
  • B1_Mean - 这应该是以B1

  • 开头的列的平均值
  • A1_Min - 这应该是以A1开头的列的最小值

  • B1_Min - 这应该是以B1开头的列的最小值

  • A1_SD - 这应该是以A1

  • 开头的列的标准偏差
  • B1_SD - 这应该是以B1

  • 开头的列的标准偏差

如何在R中完成,以便代码首先提取具有相似首字母的列,然后对其执行所需的分析。然后使用相同的首字母创建新列?

提前感谢您的帮助! :)

2 个答案:

答案 0 :(得分:0)

我创建了一个小例子,这就是我所拥有的,

df <- data.frame("A1_factor1" = rnorm(5), "A1_factor2" = rnorm(5),
                 "B1_factor1" = rnorm(5), "B1_factor2" = rnorm(5))

col.names <- names(df)
group <- unique(substr(col.names, 1, 2))
for (i in 1:length(group)){
  group.df <- df[, substr(names(df), 1, 2) == group[i]]
  df[, ncol(df)+1] <- apply(group.df, 1, mean)
  df[, ncol(df)+1] <- apply(group.df, 1, min)
  df[, ncol(df)+1] <- apply(group.df, 1, sd)
  df[, ncol(df)+1] <- apply(group.df, 1, max)
  names(df)[(ncol(df)-3):ncol(df)] <- paste(group[i], c("Mean", "Min", "SD", "Max"), sep = "_")
}
df

我希望这有帮助!

答案 1 :(得分:0)

您可以使用tidyverse

执行此操作

输入:

library(tidyverse)

set.seed(123)
df <- tibble(A1_abc = sample(1:10, 5),
             A1_cde = sample(10:15, 5),
             B1_abc = sample(1:10, 5), 
             B1_cde = sample(15:20, 5))
df
# A tibble: 5 x 4
  A1_abc A1_cde B1_abc B1_cde
   <int>  <int>  <int>  <int>
1      3     10     10     20
2      8     12      5     16
3      4     13      6     15
4      7     11      9     18
5      6     15      1     19

方式:

df %>% 
    gather(key, value) %>% 
    separate(key, c("gp", "rand"), sep = "_") %>% 
    select(-rand) %>% 
    group_by(gp) %>% 
    mutate(id = 1:n()) %>% 
    spread(gp, value) %>% 
    summarise_at(vars(2:3), funs(Min  = min(.),
                                 Max  = max(.),
                                 Mean = mean(.),
                                 SD   = sd(.)))

<强>输出:

# A tibble: 1 x 8
  A1_Min B1_Min A1_Max B1_Max A1_Mean B1_Mean A1_SD B1_SD
   <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl> <dbl> <dbl>
1     3.     1.    15.    20.    8.90    11.9  3.96  6.61

如果您想添加更多功能,只需将其添加到funs()

内的summarise_at()功能中