在循环数据帧时如何删除列?

时间:2018-11-07 13:46:17

标签: r dataframe

我有许多数据框,每个数据框都有一个具有相同名称的列;我想遍历所有数据框以删除该列。

例如:

> df1
  a b
1 1 2
2 1 2
3 1 2

> df2
  a c
1 1 3
2 1 3
3 1 3

我还有所有数据框名称的列表:

> df.list
[[1]]
[1] "df1"

[[2]]
[1] "df2"

如果我做df1$a<-NULL,则列a被删除。

我想删除两个df中的列a,这是我尝试过的:

library(dplyr)

make.null<-function(x) {
        x<-NULL
      }

lapply(df.list, function(x) {
      get(x) %>% select(starts_with("a")) %>% make.null()

       })

我也尝试过:

 lapply(df.list, function(x) {
      get(x) %>% select(-starts_with("a"))

       })

上一个示例的控制台输出为

[[1]]
  b
1 2
2 2
3 2

[[2]]
  c
1 3
2 3
3 3

但数据帧仍将a作为列:

 > df1
  a b
1 1 2
2 1 2
3 1 2

因此,如何从列表中的所有数据框中删除该列?

2 个答案:

答案 0 :(得分:0)

由于您可以使用tidyverse,因此以下是使用lapply并选择的示例

library(tidyverse)

list_1 <- lapply(1:3, function(i)(tibble(a = sample(1000),
       c = sample(1000)))) ##Creates list of data frames

new_list <- lapply(list_1, function(i) i %>% select(-c)) ##loops through and remove c variable
new_list


##Using a for loop (not as efficient)
new_list2 <- NULL

for(i in 1:length(list_1)){
  new_list2[[i]] <- list_1[[i]] %>% select(-c)
}

new_list2

答案 1 :(得分:0)

tidyverse和purrr风格,

library(tidyverse)
library(data.table)
#> 
#> 载入程辑包:'data.table'
#> The following objects are masked from 'package:dplyr':
#> 
#>     between, first, last
#> The following object is masked from 'package:purrr':
#> 
#>     transpose
df1 <- 
    data.table(a=rep(1,3),b=2)
df2 <- 
    data.table(a=rep(1,3),c=3)
list_tbl <- 
    list(df1,df2) %>% 
    map(~select(.,-a))
    # this is mapping function like loops
list_tbl
#> [[1]]
#>    b
#> 1: 2
#> 2: 2
#> 3: 2
#> 
#> [[2]]
#>    c
#> 1: 3
#> 2: 3
#> 3: 3

reprex package(v0.2.1)于2018-11-08创建