我想根据这些条件获取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
答案 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
。