我想使用矢量:
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))
创建以下向量,然后我可以将其添加到第一个向量&#34; time.int&#34;进入第二个数据库。
freq<-c(4,0,0,0,3) #wished result
此向量是属于每个时间间隔的事件的总和,有四个1&#34;时间&#34;所以第一个值得到4,依此类推。
我可能想要概括它以便我可以决定间隔,例如在新的向量中说出&#34; times&#34;中的事件。每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)
让我说我每2秒钟就会想要它(每2次。)
freq<-c(4,0,4) #wished result
或每3
freq<-c(4,4) #wished result
我知道如何使用数据透视表在Excel中执行此操作。
对不起,如果重复我在这个网站上找不到合适的问题,我甚至不知道怎么问这个以及从哪里开始。
答案 0 :(得分:4)
以下内容将生成向量freq
。
freq <- sapply(time.int, function(x) sum(x == time))
freq
[1] 4 0 0 0 3
顺便说一句,不要使用构造as.data.frame(cbind(.))
。改为使用
dat1 <- data.frame(time,value))
为了将上面的代码概括为任意长度的time.int
段,我相信以下函数会做到这一点。请注意,由于您已更改数据,因此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
答案 1 :(得分: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