2016-08-21 26 views
2

我有一個數據框的列表,我試圖添加一個矢量的相應元素作爲所有觀察值的新變量到列表的每個數據幀。添加一個新的列到數據框的列表,但只選擇一個矢量的一行

我的問題是:是否有某種「索引」跟蹤lapply函數現在在哪一步?我無法找到任何東西,但它會解決我的問題,我相信因爲我不需要循環,只能使用timevar <- time[magic.index]我認爲這個例子使我的意思更清晰。

#list of data frames 
df1 <- data.frame("Var1" = c(1:10)) 
df2 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10)) 
df3 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10),"Var3" = c(1:10)) 
dfs <- list(df1,df3,df2) 

time <- c(1,2,1) 

#this is what I want to do with lapply 
lapply(dfs, function(x) within(x, timevar <- 1)) 

dfs2 <- for (i in seq_along(dfs)){ 
lapply(dfs, function(x) within(x, timevar <- time)) 
} 

#this is what the result should look like 
dfs[[1]] <- within(dfs[[1]], timevar <- 1) 
dfs[[2]] <- within(dfs[[2]], timevar <- 2) 
dfs[[3]] <- within(dfs[[3]], timevar <- 1) 
dfs 
+0

注意'lapply()'*是*循環。 – gung

回答

1

我們可以使用Map通過cbind荷蘭國際集團與在「時間」矢量的元素「DFS」相應list元素來創建一個「timevar」列。

Map(cbind, dfs, timevar = time) 
#[[1]] 
# Var1 timevar 
#1  1  1 
#2  2  1 
#3  3  1 
#4  4  1 
#5  5  1 
#6  6  1 
#7  7  1 
#8  8  1 
#9  9  1 
#10 10  1 

#[[2]] 
# Var1 Var2 Var3 timevar 
#1  1 1 1  2 
#2  2 2 2  2 
#3  3 3 3  2 
#4  4 4 4  2 
#5  5 5 5  2 
#6  6 6 6  2 
#7  7 7 7  2 
#8  8 8 8  2 
#9  9 9 9  2 
#10 10 10 10  2 

#[[3]] 
# Var1 Var2 timevar 
#1  1 1  1 
#2  2 2  1 
#3  3 3  1 
#4  4 4  1 
#5  5 5  1 
#6  6 6  1 
#7  7 7  1 
#8  8 8  1 
#9  9 9  1 
#10 10 10  1 

如果我們使用hadleyverse,在map2purrr可能是有用的,以及

library(purrr) 
dfs %>% 
    map2(time, ~cbind(.x, timevar=.y)) 
+0

在我的例子中像魅力一樣工作,但我也得到'Data.frame中的錯誤(...,check.names = FALSE): 參數意味着不同的行數:21,23'我真的很確定它源於此'> str(time) 'data.frame':\t 23 obs。 1變量: $ time:int 2 1 2 1 2 1 1 2 2 2 ... > str(dfs [[1]]) 'data.frame':\t 21 obs。 188個變量:「但是從我的理解來看,他們不一定是一樣的長度嗎? – Susu

+0

@Susu你有'dfs'的'長度'等於'時間'的長度。看起來你有'時間'作爲data.farme'所以使用'Map(cbind,dfs,timevar = time $ time)' – akrun

+1

太好了,你懂了! '長度(時間)'確實是1.在使用't(時間)'後它起作用了!非常感謝!編輯:'時間$時間作品'以及。 – Susu

1

這是怎麼回事?

lapply(seq_len(length(dfs)),function(t) cbind(dfs[[t]],time[t])) 
+0

感謝您的評論,這在示例中很有用。 Hower在我的真實數據中我得到'Data.frame中的錯誤(...,check.names = FALSE): 參數意味着行數不同:21,23',而'23'是'時間長度' 21'是我的第一個數據框中的觀察次數。我不確定爲什麼我會得到這樣的錯誤,但對我來說這沒有意義,因爲從時間上的價值只是一個數字呢? (我試圖編輯示例以更好地匹配我的數據,但您的解決方案仍然可以在那裏使用)。有任何想法嗎? – Susu

+0

感謝您的幫助! Akrun已經解決了它,所以你不需要考慮它。 – Susu

相關問題