2017-10-13 74 views
0

我試圖將函數應用於二維數據列表。使用單獨的列中的值將列表中的列應用到列中

我正在處理的數據需要從很多探針隨時間進行測量。我將一個時間索引應用於矩陣,當探針更改時重置。

我已經通過將列表轉換爲單獨的數據框來實現此目的,但是,我希望使用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)) 
} 
) 

如果我錯了,請發表評論。

相關問題