【问题标题】:to take mean for specific column取特定列的平均值
【发布时间】:2017-11-03 05:31:04
【问题描述】:

我有 208 列,每列都有重复值(所以总共 104 个样本 X 2)。我想使用 R 循环来平均所有复制 谁能推荐我

w x y a b e
5 1 1 2 4 1
6 2 2 5 3 6
7 3 3 8 9 3
8 4 6 9 1 3

例如,我有 wxyabe 列 我想了解wxyabe 并将平均值打印到另一个数据框名称为w_xy_ab_e

【问题讨论】:

  • 不清楚重复的位置。请展示一个具有预期输出的小型可重复示例。即 10 列 5 行左右,用于帮助他人更好地帮助您
  • 对不起,我又改了标题。我需要意思
  • 我们不知道您的数据是什么样子或复制在哪里。请展示一个可重现的小示例和该示例的预期输出
  • 请在您的帖子中编辑
  • 我已经编辑了帖子。实际上我不是常用用户,所以对这些不太了解

标签: r loops dataframe


【解决方案1】:

你也可以用dplyr + tidyr做这样的事情:

library(dplyr)
library(tidyr)

cols = colnames(df)

data.frame(t(df)) %>%
  mutate(ID = rep(paste(cols[1:length(cols)%%2 == TRUE], cols[!1:length(cols)%%2], sep = "_"), each = 2)) %>%
  group_by(ID) %>%
  summarize_all(mean) %>%
  gather(variable, value, -ID) %>%
  spread(ID, value) %>%
  select(-variable)

结果:

# A tibble: 4 x 3
    b_e   w_x   y_a
* <dbl> <dbl> <dbl>
1   2.5     3   1.5
2   4.5     4   3.5
3   6.0     5   5.5
4   2.0     6   7.5

数据:

df = read.table(text = "w x y a b e
                 5 1 1 2 4 1
                 6 2 2 5 3 6
                 7 3 3 8 9 3
                 8 4 6 9 1 3", header = TRUE)

【讨论】:

    【解决方案2】:
    mtcarsd <- mtcars[1:6]
    

    要访问两列中的第一列,请使用c(T,F)

    first_cols <- mtcarsd[c(T,F)]
    
    sec_cols <- mtcarsd[c(F,T)]
    
    fs <- first_cols+sec_cols
    

    使用 sapply 函数查找所需列的平均值

    sapply(fs, mean)
    

    【讨论】:

    • 这在我所有的 208 列中都给了我“NA”
    【解决方案3】:

    这是一个使用循环的详细示例。

    df <- data.frame(w = c(5, 6, 7, 8),
                     x = c(1, 2, 3, 4),
                     y = c(1, 2, 3, 6),
                     a = c(2, 5, 8, 9),
                     b = c(4, 3, 9, 1),
                     e = c(1, 6, 3, 3))
    str(df)
    # index of columns on which we will iterate
    vect <- seq_len(ncol(df))[seq_len(ncol(df)) %% 2 != 0]
    # Extract data frame columns every two columns
    # initialize lists
    new.lst <- list() # list of dataframes of two consecutive columns
    ave.list <- list() # list of averages
    for(i in seq_along(vect)){
            new.lst[[i]] <- df[, seq(from = vect[i], to = (vect[i] + 1))]
            ave.list[[i]] <- rowMeans(new.lst[[i]], na.rm = TRUE)
            names(ave.list)[i] <- paste(colnames(new.lst[[i]])[1],
                                        colnames(new.lst[[i]])[2],
                                        sep = "_") # set the names of columns
    }
    new.lst # list of dataframes of two consecutive columns - complete
    ave.list # list of averages - complete
    # final dataframe
    df2 <- as.data.frame.list(ave.list)
    df2
    

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 2018-02-10
      • 2021-02-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多