总结了原始不同长度的矢量的结果 - Pivot表r

时间:2017-09-03 14:55:26

标签: r vector sum pivot-table

我想使用矢量:

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中执行此操作。

对不起,如果重复我在这个网站上找不到合适的问题,我甚至不知道怎么问这个以及从哪里开始。

2 个答案:

答案 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