2017-09-03 2 views
0

Je voudrais utiliser le vecteur:résumer les résultats sur un vecteur de longueur différente de l'original - Table Pivot r

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

et la base de données:

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)) 

pour créer le vecteur suivant, que je peux ensuite ajouter au premier vecteur "time.int" dans une deuxième base de données.

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

Ce vecteur est la somme des événements qui appartiennent à chaque intervalle de temps, il y a quatre 1 en « temps » si la première valeur obtient quatre et ainsi de suite. Potentiellement je voudrais le généraliser afin que je puisse décider de l'intervalle, par exemple dire somme dans un nouveau vecteur les événements dans "times" chaque 3 nombres de time.int.

EDIT pour la généralisation

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) 

disons que je veux toutes les 2 secondes (toutes les 2 time.int)

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

ou tous les 3

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

Je sais comment faites cela en Excel, avec un tableau croisé dynamique.

désolé si un doublon je ne pouvais pas trouver une question appropriée sur ce site, je ne sais même pas comment demander cela et par où commencer.

Répondre

4

Ce qui suit produira le vecteur freq.

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

BTW, ne pas utiliser la construction as.data.frame(cbind(.)). Utilisez plutôt

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

Afin de généraliser le code ci-dessus à des segments de time.int de toute longueur, je crois que la fonction suivante fera. Notez que puisque vous avez modifié les données, la sortie pour n == 1 n'est pas la même que ci-dessus.

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

Brilliant! Et si je voudrais généraliser? Pour pouvoir dire somme dans un nouveau vecteur les événements dans "temps" chaque 3 nombres de time.int au lieu de 1 par 1? –

+0

@havefun Peut-être que vous pourriez le faire avec un 'spply 'imbriqué, mais vous auriez besoin de modifier votre question et dire ce que la sortie attendue serait. –

+0

J'ai maintenant édité ma question, idéalement je voudrais choisir un paramètre au début et l'utiliser pour diviser le vecteur. –

1

Nous pouvons utiliser la fonction table pour compter le nombre d'événements et utiliser merge pour créer une trame de données résumant les informations. event_dat est la sortie finale.

# 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