【问题标题】:Keep and discard at the same time with purrrpurrr 同时保留和丢弃
【发布时间】:2021-06-05 13:44:24
【问题描述】:

purrr 定义了两个函数keep()discard(),它们根据谓词执行它们的名称。

我在此包中找不到基于谓词分隔列表/向量的函数。例如:

v <- 1:10
separate(v, function(x) x %% 2 == 0)

会返回:

list(no = c(1, 3, 5, 7, 9), yes = c(2, 4, 6, 8, 10))

我错过了什么吗?我认为这可能比调用将遍历整个列表的两个函数更有效。


编辑:我想用一个列表和一个更复杂的函数来应用于每个元素。所以我不确定是否可以使用split

例如:

l1 <- list(list(1, 2, 3), list(4, 5), list(6))
purrr::discard(l1, ~ length(.) == 3)

【问题讨论】:

  • 您可能正在寻找split()split(v, v %% 2 == 0)
  • dplyr 有group_split;但是,它适用于数据框或列表。 seq(10) %&gt;% data.frame %&gt;% group_split(even = . %% 2 == 0)

标签: r functional-programming purrr


【解决方案1】:

我们也可以用一个逻辑向量作为回收向量来进行拆分

split(v, c(TRUE, FALSE))

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • 它甚至不起作用....split(v, c(FALSE, TRUE) 可以解决问题。然而,它根本没有回答这个问题......
  • @pietrodito 我只是展示了一种拆分它的方法。无论如何你都可以这样做
【解决方案2】:

split 基础 R 中的函数就是这样做的:

v <- 1:10
split(v, v %% 2 == 0)

#$`FALSE`
#[1] 1 3 5 7 9

#$`TRUE`
#[1]  2  4  6  8 10

您可以编写一个条件并使用它来创建两个单独的列表。

v <- 1:10
inds <- v %% 2 == 0
list(yes = v[inds], no = v[!inds])

l1 <- list(list(1, 2, 3), list(4, 5), list(6))
inds <- lengths(l1) == 3
list(yes = l1[inds], no = l1[!inds])

【讨论】:

  • 是的,如第二个例子所示。
  • 但它没有回答问题,即如何将谓词应用于列表,在这里你必须使用另一个函数 lengthss 它不能用于任何函数可以应用于列表的元素......
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2012-03-24
  • 2015-03-29
相关资源
最近更新 更多