2012-05-22 4 views
7

Можно создать дубликат:
apply a function over groups of columnsсреднем каждые 16 столбцов в г

У меня есть data.frame с 30 строк и столбцов множества (1000+), но мне нужно в среднем каждые 16 столбцов вместе. Например, кадр данных будет выглядеть следующим образом (я укоротить его, чтобы сделать его проще ..):

Col1   Col2   Col3   Col4........ 

4.176   4.505   4.048   4.489 
6.167   6.184   6.359   6.444 
5.829   5.739   5.961   5.764 
. 
. 
. 

Поэтому я не могу агрегировать (у меня нет списка), и я попробовал:

a <- data.frame(rowMeans(my.df[,1:length(my.df)])) 

, который дает мне среднее количество всех 1000+ кумов, но есть ли способ сказать, что я хочу сделать это каждые 16 столбцов до конца? (они кратно 16 общего количества столбцов).

Вторичный, менее важный момент, но было бы полезно также решить эту проблему. Имен Col находятся в следующей структуре:

XXYY4ZZZ.txt 

После усредненных столбцов все, что нужно новое имя цв только с XXYY как остальные будут усреднены. Я знаю, что могу использовать gsub, но есть ли оптимальный способ усреднения и эта операция за один раз?

Я до сих пор относительно новичок в R, и поэтому я не уверен, где и как найти ответ.

+0

согласился @Joran, ответы на мой вопрос, на который вы ссылаетесь, должны быть легко адаптированы для ответа на этот вопрос. – Ben

ответ

0

Это работает для меня в гораздо меньшем фрейме данных:

rowMeans(my.df[,seq(1,length(my.df),by=16)]) 
+1

вы принимаете среднее значение только столбцов в этой последовательности (1, 17, 33 и т. Д.), А не среднее из группы столбцов 1:16, 17:32 и т. Д. – Justin

+0

Привет, Джастин, я беру среднее из столбцов 1:16, затем от 17 до 32 и так далее. Боб и Бен и Джоран, спасибо за ответы! Я попробую разные вещи и посмотрю, как это происходит. – david

+0

Извините. Неправильный вопрос. –

5

Вот пример адаптирован из @ вопрос Бен и @ ответ TylerRinker в от apply a function over groups of columns. Он должен иметь возможность применять любую функцию по матрице или кадру данных через интервалы столбцов.

# Create sample data for reproducible example 
n <- 1000 
set.seed(1234) 
x <- matrix(runif(30 * n), ncol = n) 

# Function to apply 'fun' to object 'x' over every 'by' columns 
# Alternatively, 'by' may be a vector of groups 
byapply <- function(x, by, fun, ...) 
{ 
    # Create index list 
    if (length(by) == 1) 
    { 
     nc <- ncol(x) 
     split.index <- rep(1:ceiling(nc/by), each = by, length.out = nc) 
    } else # 'by' is a vector of groups 
    { 
     nc <- length(by) 
     split.index <- by 
    } 
    index.list <- split(seq(from = 1, to = nc), split.index) 

    # Pass index list to fun using sapply() and return object 
    sapply(index.list, function(i) 
      { 
       do.call(fun, list(x[, i], ...)) 
      }) 
} 

# Run function 
y <- byapply(x, 16, rowMeans) 

# Test to make sure it returns expected result 
y.test <- rowMeans(x[, 17:32]) 
all.equal(y[, 2], y.test) 
# TRUE 

С его помощью вы можете совершать другие необычные вещи. Например, если вам необходимо знать общую сумму каждые 10 столбцов, будучи уверенным, чтобы удалить NA S, если присутствует:

y.sums <- byapply(x, 10, sum, na.rm = T) 
y.sums[1] 
# 146.7756 
sum(x[, 1:10], na.rm = T) 
# 146.7756 

Или найти стандартные отклонения:

byapply(x, 10, apply, 1, sd) 

Update

by также может быть определен как вектор групп:

byapply(x, rep(1:10, each = 10), rowMeans) 
+0

Hi jthezzel, большое спасибо! это сработало просто отлично. Я думал, что из-за моих базовых уровней R это займет больше времени, но на самом деле все прошло очень гладко ... спасибо вам снова! – david

+0

Спасибо за обновление! все это полезные комментарии! – david

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