我有许多数据框,每个数据框都有一个具有相同名称的列;我想遍历所有数据框以删除该列。
例如:
> 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
因此,如何从列表中的所有数据框中删除该列?
答案 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创建