【问题标题】:R - Purrr - Slicing using map(), or: How to slice list of tibbles of varying lengths based on NAs?R - Purrr - 使用 map() 切片,或者:如何根据 NA 切片不同长度的小标题列表?
【发布时间】:2021-10-31 20:18:22
【问题描述】:

我试图弄清楚如何根据非 NA 的首次出现来对不同长度的小标题列表进行切片或子集化。我所有的小标题都具有不同的尺寸和许多 NA,但对所有人来说,共同点是它们在我需要删除的第一行中有一些 NA。

我只对删除前几行而保留所有后续行感兴趣。

我创建了一个可以说明我的数据的代表:

tbl <- tibble(
  first = c(NA, 1, 2, 3, NA),
  second = c(NA, 1, NA, 3, NA),
  third = c(NA, 1, 2, NA, NA)
)

lst <- list(
  list1 = tbl,
  list2 = tbl,
  list3 = tbl
)

lst
$list1
# A tibble: 5 x 3
  first second third
  <dbl>  <dbl> <dbl>
1    NA     NA    NA
2     1      1     1
3     2     NA     2
4     3      3    NA
5    NA     NA    NA

$list2
# A tibble: 5 x 3
  first second third
  <dbl>  <dbl> <dbl>
1    NA     NA    NA
2     1      1     1
3     2     NA     2
4     3      3    NA
5    NA     NA    NA

$list3
# A tibble: 5 x 3
  first second third
  <dbl>  <dbl> <dbl>
1    NA     NA    NA
2     1      1     1
3     2     NA     2
4     3      3    NA
5    NA     NA    NA

我尝试将map()which.min()is.na() 结合使用,以尝试根据非NA 的第一个实例进行切片,但无法使其工作。

sliced <- map(lst, slice, which.min(is.na):nrow())

我得到的只是以下错误:

Error in which.min(is.na) : 
  cannot coerce type 'builtin' to vector of type 'double'

有没有办法解决这个问题?

【问题讨论】:

  • 第一行可以是NA, 2, 3 吗?在这种情况下,输出会是什么?
  • 是的,对不起。子集/切片将仅由每个小标题的第一列决定。

标签: r dplyr purrr


【解决方案1】:

is.na 需要一个向量。您可能需要将特定列传递给它。

例如,使用第一列你可以做 -

library(dplyr)
library(purrr)

map(lst, ~.x %>% slice(which.max(!is.na(.[[1]])) : n()))


#$list1
# A tibble: 4 x 3
#  first second third
#  <dbl>  <dbl> <dbl>
#1     1      1     1
#2     2     NA     2
#3     3      3    NA
#4    NA     NA    NA

#$list2
# A tibble: 4 x 3
#  first second third
#  <dbl>  <dbl> <dbl>
#1     1      1     1
#2     2     NA     2
#3     3      3    NA
#4    NA     NA    NA

#$list3
# A tibble: 4 x 3
#  first second third
#  <dbl>  <dbl> <dbl>
#1     1      1     1
#2     2     NA     2
#3     3      3    NA
#4    NA     NA    NA

【讨论】:

  • 如果第一列在所有小标题中的名称也不相同,是否可以使用此方法? IE。基本上总是使用第一列,不管名字是什么?
  • 是的,您可以使用.[[1]] 代替列名。查看更新后的答案。
  • 完全按预期工作。谢谢
猜你喜欢
  • 2016-11-08
  • 2017-11-27
  • 2022-06-16
  • 2017-07-27
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多