2012-05-22 134 views
7

可能重複:
apply a function over groups of columnsR中的每個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+ coumns的平均值,但是有沒有什麼辦法可以說我想每隔16列做一次,直到最後? (它們是總列數的16倍)。

一個次要的,不太重要的點,但也可以用來解決這個問題。 山坳名稱的結構如下:

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

這是改編自@奔的問題,從@apply a function over groups of columns TylerRinker的答案的例子。它應該能夠通過列的間隔在矩陣或數據幀上應用任何函數。

# 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■如果存在:

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) 

更新

by也可以指定爲一個組的向量:

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

嗨jthetzel,非常感謝!這工作得很好。我認爲,由於我的基本R級別,它會花更長的時間,但實際上它非常流暢......再次感謝你! – david

+0

非常感謝您的更新!這些都是有用的意見! – david