从数据框列表中删除列

时间:2017-08-21 14:38:02

标签: r lapply

我有csv文件列表,看起来像我在下面创建的数据框:

    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是数据框列表。

df_list<-list(a,b)

我需要在几天内创建数据帧,例如day1,day2,day3,day4等等。我的要求是 例如,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)))])
  }
}

2 个答案:

答案 0 :(得分:0)

您可以使用以下语法 1

lapply(mylist,`[`,-2)

从数据框列表中删除第二列。

每次我将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) } 循环播放,以便下一步删除下一列。

index.styl

答案 1 :(得分: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