2017-08-21 77 views
0

我的CSV文件看起來像我下面創建數據幀列表:從dataframes的列表中刪除列

a<-data.frame(A=c("Boston","Boston","Boston","Boston","Boston"),pred_1=c(4,3,32,2,3), pred_2=c(5,3,2,6,22),pred_3=c(3,2,7,1,23),pred_4=c(8,9,2,6,21),pred_5=c(4,3,32,2,3), pred_6=c(5,3,2,6,22),pred_7=c(3,2,7,1,23),pred_8=c(8,9,2,6,21), 
        pred_9=c(4,3,32,2,3), pred_10=c(5,3,2,6,22),pred_11=c(3,2,7,1,23),pred_12=c(8,9,2,6,21)) 
    b<-data.frame(A=c("Hartford","Hartford","Hartford","Hartford","Hartford"),pred_1=c(3,6,6,2,5), pred_2=c(2,7,8,4,23),pred_3=c(1,4,7,3,22),pred_4=c(9,2,1,3,25),pred_5=c(3,6,6,2,5), pred_6=c(2,7,8,4,23),pred_7=c(1,4,7,3,22),pred_8=c(9,2,1,3,25),pred_9=c(3,6,6,2,5), 
pred_10=c(2,7,8,4,23),pred_11=c(1,4,7,3,22),pred_12=c(9,2,1,3,25)) 

df_list是dataframes名單。

df_list<-list(a,b) 

我需要幾天的基礎,例如,第1天,第2天,第3天,第4天,在這裏等等on.My要求上創建dataframes是 ,例如,day9數據幀不應該從pred_1包含列pred_8但包含從pred_9到pred_12的列, 類似地,days11數據幀應包含從pred_11到pred_12的列,但不應包含從pred_1到pred_10的列。 我已經編寫了下面的代碼,用於創建不按要求工作的單個數據幀。

m <- list.files(pattern=".csv",ignore.case=TRUE, all.files = TRUE) # m stores all the csv files 
for(iter in 1:length(m)){ 
    print(m[iter]) 
    my_csv=read.csv(m[iter]) 
    i1 <- 1:12 
    i<-1:12 
    for(i in seq_along(i1)) { 
    print(i) 
    assign(paste0("days", i), 
      value = my_csv[, setdiff(names(my_csv), 
            c("A", 
            grep(paste("_", 1:i1[i],collapse="|", sep=""), 
             colnames(my_csv), value = TRUE)))]) 
    } 
} 
+0

看着你的個人資料,我可以看到你沒有接受你問過的少數幾個問題的答案。您應該因各種原因接受答案,包括告訴人們您的問題已得到解答,同時也欣賞那些分配給您問題的人的時間。閱讀並採取行動:[我應該怎麼做當有人回答我的問題?](https://stackoverflow.com/help/someone-answers) – Masoud

回答

0

您可以使用下面的語法1

lapply(mylist,`[`,-2) 

從dataframes的列表中刪除的第二列。

在我的for循環中,每次我將其分配給mylist,因此在下一步中,下一列將被刪除。

day1 <- df_list #day1 has all of the columns 
mylist <- df_list #make a new list to avoid from altering original list 

for (i in 2:12) { 

x <- paste0("day",i) 
assign(x,lapply(mylist,`[`,-2)) 
mylist <-lapply(mylist,`[`,-2) 

} 
0

我已形成從ab第一數據幀,然後使用下面的循環,以產生期望的輸出。

> df <- rbind(a,b) 
> df 
      A pred_1 pred_2 pred_3 pred_4 pred_5 pred_6 pred_7 pred_8 pred_9 pred_10 pred_11 pred_12 
1 Boston  4  5  3  8  4  5  3  8  4  5  3  8 
2 Boston  3  3  2  9  3  3  2  9  3  3  2  9 
3 Boston  32  2  7  2  32  2  7  2  32  2  7  2 
4 Boston  2  6  1  6  2  6  1  6  2  6  1  6 
5 Boston  3  22  23  21  3  22  23  21  3  22  23  21 
6 Hartford  3  2  1  9  3  2  1  9  3  2  1  9 
7 Hartford  6  7  4  2  6  7  4  2  6  7  4  2 
8 Hartford  6  8  7  1  6  8  7  1  6  8  7  1 
9 Hartford  2  4  3  3  2  4  3  3  2  4  3  3 
10 Hartford  5  23  22  25  5  23  22  25  5  23  22  25 

> for(i in 2:ncol(df)) { 
+  
+  x <- paste0("Day", i-1) 
+  assign(x, cbind(df[1], df[(i):(ncol(df))])) 
+  
+ } 

> Day4 
      A pred_4 pred_5 pred_6 pred_7 pred_8 pred_9 pred_10 pred_11 pred_12 
1 Boston  8  4  5  3  8  4  5  3  8 
2 Boston  9  3  3  2  9  3  3  2  9 
3 Boston  2  32  2  7  2  32  2  7  2 
4 Boston  6  2  6  1  6  2  6  1  6 
5 Boston  21  3  22  23  21  3  22  23  21 
6 Hartford  9  3  2  1  9  3  2  1  9 
7 Hartford  2  6  7  4  2  6  7  4  2 
8 Hartford  1  6  8  7  1  6  8  7  1 
9 Hartford  3  2  4  3  3  2  4  3  3 
10 Hartford  25  5  23  22  25  5  23  22  25 
+0

原始csv's沒有相同的列。爲了簡單起見,我在這個例子中採用了相同的列。 – User0590

+0

@Masoud提供的其他答案適用於這種情況。您可以使用'max(ncol)'確定循環的長度,如下所示: 'for(i in 2:max(ncol(df_list [[1]]),ncol(df_list [[2]])) ){ x < - paste0(「Day」,i-1) assign(x,lapply(df_list,'[',-2)) df_list < - lapply(df_list,''',-2) }' – Sagar