如何计算所选列的平均值

时间:2016-05-12 20:30:17

标签: r

我想根据这些条件获取rowMean   a)具有值范围的列的行平均值:> 0.1& < 0.9   b)具有值范围的列的行平均值:> 0.9

Input dataframe
    > df1[35:68,10:13]
            X3322_1       X3322_2         X3322_3         X3322_4     X3322_5
           1.119000      0.1020200       1.183000       1.093800      1.2522000
           1.019500     -0.2394300       3.656900      -0.187350      3.6569000
           2.053900      0.0659420       0.694840       0.481820      1.3587000

预期产出

> res   
              A            B
           0.1020200     1.162
             0           2.777
            0.612        1.7063

2 个答案:

答案 0 :(得分:2)

一种方法是添加行索引,然后融化数据帧。由于您没有提供输入,我只是使用您的部分数据。我确信有人可以提出一种更快/更简单的方法,但有一种方法是:

library(reshape2)


a <- c(1.119, 1.0195, 2.0539)
b <- c(0.10202, -0.23943, 0.0659)
c <- c(1.183, 3.6569, 0.69840)

df <- data.frame(a=a, b=b,c=c)


df$row <- 1:nrow(df)
df_m <- melt(df,c("row"))
df_m$val_1_9 <- ifelse(df_m$value > 0.1 & df_m$value < 0.9, df_m$value, NA)
df_m$val_gt_9 <- ifelse(df_m$value > 0.9, df_m$value, NA)


res <- aggregate(df_m[, c("val_1_9","val_gt_9")], list(df_m$row), mean,na.rm=TRUE)

res
  Group.1 val_1_9 val_gt_9
1       1 0.10202   1.1510
2       2     NaN   2.3382
3       3 0.69840   2.0539

答案 1 :(得分:1)

这是另一个基础R解决方案。在超大型数据集上可能有点慢,但在中型问题上可以很好地解决。我创建了一个新的data.frame,用作一个不可用的:

# create 10X10 data.frame, values in N(1,1) distribution
set.seed(1234)
df <- data.frame(matrix(rnorm(100)+1,10))
names(df) <- letters[1:10]

# get averages based on first criterion: : > 0.1 & < 0.9
apply(df[5:8, 2:8], 1, function(i) mean(ifelse(i > 0.1 | i < 0.9, i, NA), na.rm=T))
apply(df[5:8, 2:8], 1, function(i) mean(ifelse(i >= 0.9, i, NA), na.rm=T))

要合并这些,您可以使用rbind