2017-10-13 4 views
0

2次元データのリストに関数を適用しようとしています。別の列の値を使用してリストの列に関数を適用する

私が取り組んでいるデータは、多くのプローブから経時的に測定しています。私は、プローブが変化したときにリセットするマトリックスにタイムインデックスを適用します。

私はこのリストを個々のデータフレームに変換することでこれを達成しましたが、私はlapply()ファミリのものを使用して、データセットの拡大に​​合わせてこれを実現したいと考えています。

これは動作します、個々の行列のアプローチです:

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 

私は別の実験から同様の行列のリストの上に、このプロセスのために地図の家族からの機能を使用したいと思います。

答えて

1

私はそれがあなたの希望lapplyコードのベース与えるべきだと思う:

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 

data.tableパッケージは、より大きなデータセットのために便利なことができただけでなく、このための機能を捧げていることを。グループ内で計算をしたいだけの場合は、data.tableを使用する方が簡単です。

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

私が正しく理解していれば、あなたのデータは掲載されている例のようなデータフレームのリストです。その場合は:

データ:

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

機能:

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

私が間違っていたら、コメントしてください。

関連する問題