2017-10-13 6 views
0

J'essaie d'appliquer une fonction à une liste de données bidimensionnelles.Appliquer la fonction à la colonne dans la liste en utilisant des valeurs dans une colonne séparée

Les données sur lesquelles je travaille prennent des mesures dans le temps à partir de nombreuses sondes. J'applique un index de temps à la matrice qui se réinitialise quand la sonde change.

Je l'ai fait en transformant la liste en données individuelles, cependant, je voudrais utiliser quelque chose de la famille lapply() pour y parvenir au fur et à mesure que mes données augmentent.

Ceci est l'approche matricielle individuelle qui fonctionne:

source = c(1,1,1,2,2,2,3,3,3,4,4,4) 
df1 = data.frame(source) 
df1$elapsedTime <- (ave(df1$source, df1$source, FUN = seq_along)) 

df 
# source elapsedTime 
# 1  1   1 
# 2  1   2 
# 3  1   3 
# 4  2   1 
# 5  2   2 
# 6  2   3 
# 7  3   1 
# 8  3   2 
# 9  3   3 
# 10  4   1 
# 11  4   2 
# 12  4   3 

Je voudrais utiliser une fonction de la famille carte de ce processus sur une liste des matrices similaires de différentes expériences.

Répondre

1

Je pense que cela devrait vous donner une base pour lapply désirée code:

source = c(1,1,1,2,2,2,3,3,3,4,4,4) 
df.in = data.frame(source) 

df.list <- split(df.in, f = df$source) 
res <- lapply(df.list, function(df){ 
    df$elapsedTime <- seq_along(1:length(df$source)) 
    return(df) 
}) 
df.out <- bind_rows(res) 

df.out 
# source elapsedTime 
# 1  1   1 
# 2  1   2 
# 3  1   3 
# 4  2   1 
# 5  2   2 
# 6  2   3 
# 7  3   1 
# 8  3   2 
# 9  3   3 
# 10  4   1 
# 11  4   2 
# 12  4   3 

Notez que paquet data.table a des fonctions dédiées pour cela aussi, qui peut être pratique pour les grands ensembles de données. Aussi, si vous voulez juste faire un calcul au sein d'un groupe, il est plus simple d'utiliser data.table pour cela:

library(data.table) 
dt = data.table(source) 
dt[, elapsedTime := 1:.N, by = source] 
1

Si je comprends bien, vos données sont une liste de trames de données comme dans l'exemple affiché. Si tel est le cas:

données:

lis = list(df1 = data.frame(source = c(1,1,1,2,2,2,3,3,3,4,4,4)), 
      df2 = data.frame(source = rep(1:5, each = 4))) 

Fonction:

lapply(lis, function(x){ 
    elapsedTime = ave(x[,1], x[,1], FUN = seq_along) 
    return(data.frame(x, elapsedTime)) 
} 
) 

Si je me trompe s'il vous plaît commentaire.