2017-07-26 20 views
0

その特定の行の値の頻度をその時点までカウントする列を作成しようとしています。各マトリックスのコードは、現在のデータと望ましい結果を示します。したがって、列の行列タイプ|値:その行の累積数がある前に来たタイプの各合計についてR行の特定のアイテムの累積頻度の列

test <- matrix(c(
1,0.14,1, 
1,0.1345,2, 
2,1.245,1, 
2,1.532,2, 
3,3.5345,1, 
3,2.987,2, 
2,1.743,3),ncol=3, byrow=TRUE) 

colnames(test) <- c("Type", "Value","Frequency") 

test <- matrix(c(
1,0.14, 
1,0.1345, 
2,1.245, 
2,1.532, 
3,3.5345, 
3,2.987, 
2,1.743),ncol=2, byrow=TRUE) 

colnames(test) <- c("Type", "Value") 

私は型の列に対応する出力周波数列を取得しようとしています。 ご協力いただければ幸いです。

+0

は、あなたが期待する結果が何であるかを示すことができますか? –

+0

こんにちは@raistlin。 2番目のコードブロックは予想される結果で、前に来た各タイプのカウントを持つ "Frequency"という余分な列があります。 – AlwaysInTheDark

答えて

1

dplyrを使用すると、データをTypeでグループ化し、各行の行番号を返すことができます。データはグループ化されているため、行番号は指定された値Typeが現れた回数と等しくなります。

library(tidyverse) 

test %>% 
    tbl_df() %>% 
    group_by(Type) %>% 
    mutate(Frequency = row_number()) 
+0

データを日付順に並べ替える必要がある場合は、データをタイプごとにソートし、対応する頻度値を作成して日付順にソートすることをお勧めしますか? – AlwaysInTheDark

+0

このコードでは、データを 'Type'でソートする必要はありません。サンプルデータの最後の行に注意してください。それは 'Type'のために2を持っています、そして、Frequencyは2が使用された3回目としてそれをまだカウントします。 –

+0

それは素晴らしいです!どうもありがとう。 – AlwaysInTheDark

0

多分この方法:

> Frequency<-sapply(1:nrow(test), function(i) sum(test[1:i,1]==test[i,1])) 
> cbind(test, Frequency) 
    Type Value Frequency 
[1,] 1 0.1400   1 
[2,] 1 0.1345   2 
[3,] 2 1.2450   1 
[4,] 2 1.5320   2 
[5,] 3 3.5345   1 
[6,] 3 2.9870   2 
[7,] 2 1.7430   3 
+0

これはかなり便利な選択肢です。どうもありがとう! – AlwaysInTheDark