7

重複の可能性:
列のグループに関数を適用する

30 行と多くdata.frameの列 (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 の倍数です)。

二次的な、あまり重要でない点ですが、これを解決するのにも役立ちます。列名は次の構造になっています。

XXYY4ZZZ.txt

列を平均化したら、必要なのは新しい列名だけXXYYで、残りは平均化されます。gsub を使用できることはわかっていますが、平均化とこの操作を一度に行う最適な方法はありますか?

私はまだRに比較的慣れていないため、どこでどのように答えを見つけるべきかわかりません。

4

2 に答える 2

5

@ben の質問と @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 列ごとの合計を知る必要がある場合は、NAs が存在する場合は必ず削除してください。

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)
于 2012-05-22T16:04:08.067 に答える
0

これは、はるかに小さなデータ フレームで機能します。

rowMeans(my.df[,seq(1,length(my.df),by=16)])
于 2012-05-22T15:31:40.620 に答える