1
b = c(1,1,2,2,3,3,4,4,1)
c = c(10,10,20,20,30,30,40,40,5)
a <- NULL
a  <- matrix(c(b,c), ncol=2)

私がしたいのは、この行列の最初の列の数値を比較することです。最初の数値が列の 2 番目の連続した数値と等しい場合 (この場合は 1 = 1 など)、次のようにします。 2 番目の列の対応する数値を合計すると (10 + 10 = 20 など)、それは 1 つの値になるため、この出力を別のベクトルに格納したいと考えています。

私が探しているマトリックスからの出力は次のとおりです。

     [,1] [,2]  [,3]
[1,]    1   10  20 
[2,]    1   10  40
[3,]    2   20  62
[4,]    2   20  85
[5,]    3   30  5
[6,]    3   32
[7,]    4   40
[8,]    4   45
[9,]    1   5  

私はRが初めてで、これに苦労しています。前もって感謝します!

4

2 に答える 2

1

これは、あなたの望むことですか?クリーンなソリューションがあるに違いありませんが、パッケージ内baseで試してみます。rollsumzoo

library(zoo)
mm <- cbind(c(1, 1, 2, 2, 3, 3, 4, 4, 1), c(10, 10, 20, 20, 30, 30, 40, 40, 5))

# calculate all lagged sums of column 2
sums <- rollsum(x = mm[ , 2], k = 2)

# calculate differences between consecutive numbers in column 1
diffs <- diff(mm[ , 1])

# select sums where diff is 0, i.e. where the two consecutive numbers in column 1 are equal.
sums2 <- sums[diffs == 0]

sums2
# [1] 20 40 60 80
于 2013-09-06T09:28:51.547 に答える
1

rleこれはとの仕事のように思えtapplyます:

b = c(1,1,2,2,3,3,4,4,1)
c = c(10,10,20,20,30,30,40,40,5)
a <- NULL
a  <- matrix(c(b,c), ncol=2)

A <- rle(a[, 1])$lengths
tapply(a[, 2], rep(seq_along(A), A), sum)
#  1  2  3  4  5 
# 20 40 60 80  5

説明:

  • rle行列「a」の最初の列の項目のランレングスを識別します。
  • tapplyを使用してランレングスから のグループ化変数を作成しますrep(seq_along(A), A)
  • これら 2 つの要素を組み合わせて、必要なtapply金額を取得します。
于 2013-09-06T09:39:29.370 に答える