2016-05-12 2 views
1

Я хочу взять rowMean столбцов на основе этих критериев а) строки означают столбцы с диапазоном значений:> 0,1 & < 0,9 б) строки означают столбцы с диапазоном значений:> 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

укажите данные примера с 'dput'. – lmo

+0

Пожалуйста, поделитесь некоторым воспроизводимым кодом. Вы пробовали фильтр в dplyr-пакете и функции rowMeans? – sachinv

+0

Нет, я не пробовал пакет dplyr – Kryo

ответ

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.

2

Один из способов сделать это было бы добавить индексы строк, а затем плавить dataframe. Поскольку вы не предоставили dput, я просто использую часть ваших данных. Я уверен, что кто-то может придумать более быстрый/простой способ сделать это, но один путь будет:

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

Аналогичное примечание: 'ifelse' и промежуточные переменные можно было бы избежать путем' aggregate'ing сразу на (1) строках и (2) на интервале значений. Подходом может быть «m = as.matrix (df); tap (m, list (row (m), cut (m, c (-Inf, 0.1, 0.9, Inf), right = FALSE)), mean) ' –

Смежные вопросы