2017-09-03 8 views
0

は、元の長さの異なるベクトルに結果を要約する - 私はベクトル使用したいピボットテーブルR

time.int<-c(1,2,3,4,5) #vector to be use as a "guide" 

とデータベース次ベクトルを作成する

time<-c(1,1,1,1,5,5,5) 
value<-c("s","s","s","t","d","d","d") 
dat1<- as.data.frame(cbind(time,value)) 

を最初のベクトル "time.int"に2番目のデータベースに追加することができます。

freq<-c(4,0,0,0,3) #wished result 

このベクターは、各時間区間に属するイベントの合計である、最初の値はそれほど上の4とを取得するように、「時間」の4つの1があります。

潜在的に私は間隔を決めることができるように一般化したいと思います。例えば、新しいベクトルの合計を「時間」の3つのtime.intのイベントで合計します。一般化

time.int<-c(1,2,3,4,5,6) 
time<-c(1,1,1,2,5,5,5,6) 
value<-c("s","s","s","t", "t","d","d","d") 
dat1<- data.frame(time,value) 

ため

EDIT私はどのように知っているのは、私はそれを2秒毎(ごとに2 time.int)

freq<-c(4,0,4) #wished result 

またはすべての3

freq<-c(4,4) #wished result 

をしたいとしましょうピボットテーブルを使って、それをExcelで実行します。

申し訳ありません私はこのウェブサイトで適切な質問を見つけることができませんでしたが、私はこれをどのように尋ねるのか、どこから始めるべきか分かりません。

答えて

4

以下は、ベクターfreqを生成します。

freq <- sapply(time.int, function(x) sum(x == time)) 
freq 
[1] 4 0 0 0 3 

ところで、as.data.frame(cbind(.))という構文を使用しないでください。任意の長さのtime.intのセグメントに上記のコードを一般化するために

dat1 <- data.frame(time,value)) 

を代わりに使用してください、私は次の関数がそれを行うと確信しています。データを変更したので、n == 1の出力は上記と同じではないことに注意してください。

fun <- function(x, y, n){ 
    inx <- lapply(seq_len(length(x) %/% n), function(m) seq_len(n) + n*(m - 1)) 
    sapply(inx, function(i) sum(y %in% x[i])) 
} 

freq1 <- fun(time.int, time, 1) 
freq1 
[1] 3 1 0 0 3 1 

freq2 <- fun(time.int, time, 2) 
freq2 
[1] 4 0 4 

freq3 <- fun(time.int, time, 3) 
freq3 
[1] 4 4 
+0

ブリリアント!私が一般化したいのですか?新しいベクトルで合計を言うことができるようにするには、「時間」のイベントは、それぞれ1つではなく1つのtime.intの3つの数字ですか? –

+0

@havefunおそらくネストされた 'sapply'で行うことができますが、あなたの質問を編集し、期待される出力が何であるかを述べる必要があります。 –

+0

私は今質問を編集しました。理想的には、最初にパラメータを選択し、それを使ってベクトルを分割したいと思います。 –

1

私たちは、イベントの数をカウントするtable機能を使用して、情報をまとめたデータフレームを作成するためにmergeを使用することができます。 event_datが最終出力です。

# Create example data 
time.int <- c(1,2,3,4,5) 
time <- c(1,1,1,1,5,5,5) 

# Count the event using table and convert to a data frame 
event <- as.data.frame(table(time)) 

# Convert the time.int to a data frame 
time_dat <- data.frame(time = time.int) 

# Merge the data 
event_dat <- merge(time_dat, event, by = "time", all = TRUE) 

# Replace NA with 0 
event_dat[is.na(event_dat)] <- 0 

# See the result 
event_dat 
    time Freq 
1 1 4 
2 2 0 
3 3 0 
4 4 0 
5 5 3 
関連する問題