R语言 在列表中的对象上迭代管道

gzjq41n4  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(89)

我有一系列的 Dataframe ,我想使用管道在它们上运行几个函数。我创建了一个对象列表,如下所示(实际上大约有30个对象):

a <- 1:10
b <- 5:14
c <- 10:19
d <- c(NA, 4:12)
e <- 60:69
f <- 7:16
d1 <- tibble(a, b, c, d, e)
d2 <- tibble(a, b, c, e, f)
d_list <- c(d1, d2)

然后我尝试使用for循环在 Dataframe 上管道函数:

for(d in d_list){
  d %>% 
    select(c(1, 3:5)) %>% 
    na.omit()
}

如果我在for循环外的一个tibles上运行管道,它工作得很好。但是在循环中我得到一个错误:UseMethod(“select”)中的错误:没有适用于“select”的方法应用于类“c('integer','numeric')”的对象。我猜这意味着解析器不理解我想将函数应用于d_list中的 Dataframe ;但我不明白为什么
谢谢
彼得

2wnc66cl

2wnc66cl1#

一旦你修复了@bretauv的答案中发现的问题(list(d1, d2)而不是c(d1, d2)),然后尝试:

d_list |> 
   lapply(select, c(1,3:5)) |> 
   lapply(na.omit)

lapply接受一个列表作为输入,将指定的函数(带参数)应用到每个元素,并将结果作为列表返回。
输出是一个列表:

# A tibble: 9 × 4
      a     c     d     e
  <int> <int> <int> <int>
1     2    11     4    61
2     3    12     5    62
3     4    13     6    63
4     5    14     7    64
5     6    15     8    65
6     7    16     9    66
7     8    17    10    67
8     9    18    11    68
9    10    19    12    69

[[2]]
# A tibble: 10 × 4
       a     c     e     f
   <int> <int> <int> <int>
 1     1    10    60     7
 2     2    11    61     8
 3     3    12    62     9
 4     4    13    63    10
 5     5    14    64    11
 6     6    15    65    12
 7     7    16    66    13
 8     8    17    67    14
 9     9    18    68    15
10    10    19    69    16
c9x0cxw0

c9x0cxw02#

您需要调用list()而不是c()c()以一种奇怪的方式连接两个tibble

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

a <- 1:10
b <- 5:14
c <- 10:19
d <- c(NA, 4:12)
e <- 60:69
f <- 7:16
d1 <- tibble(a, b, c, d, e)
d2 <- tibble(a, b, c, e, f)
d_list <- c(d1, d2)
d_list
#> $a
#>  [1]  1  2  3  4  5  6  7  8  9 10
#> 
#> $b
#>  [1]  5  6  7  8  9 10 11 12 13 14
#> 
#> $c
#>  [1] 10 11 12 13 14 15 16 17 18 19
#> 
#> $d
#>  [1] NA  4  5  6  7  8  9 10 11 12
#> 
#> $e
#>  [1] 60 61 62 63 64 65 66 67 68 69
#> 
#> $a
#>  [1]  1  2  3  4  5  6  7  8  9 10
#> 
#> $b
#>  [1]  5  6  7  8  9 10 11 12 13 14
#> 
#> $c
#>  [1] 10 11 12 13 14 15 16 17 18 19
#> 
#> $e
#>  [1] 60 61 62 63 64 65 66 67 68 69
#> 
#> $f
#>  [1]  7  8  9 10 11 12 13 14 15 16

如果使用list(),则可以在其上使用lapply()

d_list <- list(d1, d2)

d_list <- lapply(d_list, function(x) {
  x %>% 
    select(c(1, 3:5)) %>% 
    na.omit()
})
d_list
#> [[1]]
#> # A tibble: 9 × 4
#>       a     c     d     e
#>   <int> <int> <int> <int>
#> 1     2    11     4    61
#> 2     3    12     5    62
#> 3     4    13     6    63
#> 4     5    14     7    64
#> 5     6    15     8    65
#> 6     7    16     9    66
#> 7     8    17    10    67
#> 8     9    18    11    68
#> 9    10    19    12    69
#> 
#> [[2]]
#> # A tibble: 10 × 4
#>        a     c     e     f
#>    <int> <int> <int> <int>
#>  1     1    10    60     7
#>  2     2    11    61     8
#>  3     3    12    62     9
#>  4     4    13    63    10
#>  5     5    14    64    11
#>  6     6    15    65    12
#>  7     7    16    66    13
#>  8     8    17    67    14
#>  9     9    18    68    15
#> 10    10    19    69    16

相关问题