2017-04-16 180 views
0

我有一個包含53個數據框的列表,並且希望爲每個這些數據框添加一個不同的列,例如,第一個數據框包含6列和80行,我想添加一個包含「Week1」的新列。第二個數據框有6列和60行,我想添加一個包含「Week2」的新列等等。如何在data.frames存儲在一個列表中時將列添加到data.frames中

我有一個向量包含帶有「Week1」到「Week 53」的字符串,但我不知道如何將此特定列添加到列表中的每個數據框。

到目前爲止,我試圖用lapply函數編寫一個循環和一個方法,但是我沒有解決它。我會感謝您的幫助! 下面我到目前爲止嘗試的兩種方法的代碼。 循環:

for(i in 1:53){ 
    if(mylist[i]==name[i]){ 
    mylist[i] <- cbind(mylist[i],name[i]) 
    } 
    i <- i+1 
} 

,並與lapply的辦法:

f <- function(i){ 
    cbind(mylist,name) 
} 
myfilelist <- lapply(myfilelist,f) 

回答

4

你可以嘗試使用Mapcbind像這樣:

x <-data.frame(matrix(1:4,2)) 
myfilelist <-list(x,x) 

week <-paste0("week",1:2) #53 in your case 

Map(cbind, myfilelist, week=as.list(week)) 

[[1]] 
    X1 X2 week 
1 1 3 Week1 
2 2 4 Week1 

[[2]] 
    X1 X2 week 
1 1 3 Week2 
2 2 4 Week2 

如果你想自動創建「Week1」,「Week2」的矢量使用:

week <-lapply(seq(1:length(myfilelist)),function(i) paste0("Week",i)) 
Map(cbind, myfilelist, week=week) 
+2

妙解+1 – PKumar

1

如果您有興趣for loop解決方案,這裏是一個,我假設周這個數字dataframes和數量都相同:

df1 <- data.frame(x=1:10,y=2:11) 
df2 <- data.frame(x=1:20,y=2:21,c=letters[1:20]) 
lis <- list(df1,df2) 
vect <- c("week1","week2") 

for(i in 1:length(lis)){ 
    week <-rep(vect[i],max(lengths(lis[[i]]))) 
    lis[[i]] <- cbind(lis[[i]],week) 
} 

輸出

> lis 
[[1]] 
    x y week 
1 1 2 week1 
2 2 3 week1 
3 3 4 week1 
4 4 5 week1 
5 5 6 week1 
6 6 7 week1 
7 7 8 week1 
8 8 9 week1 
9 9 10 week1 
10 10 11 week1 

[[2]] 
    x y c week 
1 1 2 a week2 
2 2 3 b week2 
3 3 4 c week2 
4 4 5 d week2 
5 5 6 e week2 
6 6 7 f week2 
7 7 8 g week2 
8 8 9 h week2 
9 9 10 i week2 
10 10 11 j week2 
11 11 12 k week2 
12 12 13 l week2 
13 13 14 m week2 
14 14 15 n week2 
15 15 16 o week2 
16 16 17 p week2 
17 17 18 q week2 
18 18 19 r week2 
19 19 20 s week2 
20 20 21 t week2 

> 
1

另一個選項(使用@PLapointe的數據):

f <- function(i){ 
    myfilelist[[i]]$week <- paste0('Week_',i) 
    myfilelist[[i]] 
} 

lapply(seq_along(myfilelist), f) 

其給出:

[[1]] 
    X1 X2 week 
1 1 3 Week_1 
2 2 4 Week_1 

[[2]] 
    X1 X2 week 
1 1 3 Week_2 
2 2 4 Week_2 
3

另一個想法(使用@PLapointe的數據)

library(purrr) 
library(dplyr) 

map2(myfilelist, 
    seq_along(myfilelist), 
    ~ mutate(.x, week = paste0("week", .y))) 

其中給出:

#[[1]] 
# X1 X2 week 
#1 1 3 week1 
#2 2 4 week1 
# 
#[[2]] 
# X1 X2 week 
#1 1 3 week2 
#2 2 4 week2 

按照由@alistaire提到的,使用開發版的purrrv0.2.2.9000)你可以這樣做:

imap(myfilelist, ~mutate(.x, week = paste0('week', .y))) 

從文檔:

imap_xxx(x, ...),索引圖,短手map2(x, names(x), ...)如果x有名字,或者map2(x, seq_along(x), ...)如果它不。 如果你需要計算兩個值和元素的 位置

+1

有在purrr的devel的版本用於此快捷方式,這非常有用:'myfilelist%>%IMAP(〜 mutate(.x,week = paste0('week',.y)))' – alistaire

+0

哦,有趣!感謝您指出。 –

相關問題