【问题标题】:Pop out observation/row from a data frame从数据框中弹出观察/行
【发布时间】:2017-03-03 18:38:53
【问题描述】:

我的数据如下所示:

library(tidyverse)

set.seed(1)
df <- tibble(
    id = c("cat", "cat", "mouse", "dog", "fish", "fish", "fish"),
    value = rnorm(7, 100, sd = 50)
)

我如何“弹出”fish 的最高值,例如将鱼移动到新数据帧并同时将其从当前数据帧中删除?

这可行(但看起来并不那么优雅):

df_store <- df %>% 
    filter(id == "fish") %>% 
    top_n(1)

df <- anti_join(df, df_store)

有没有更好的办法?

【问题讨论】:

  • 仅供参考,在基础 R 中,您可以使用 split 执行此操作,以使用 data.frames 创建 list 使用 split(df, with(df, id == "fish" &amp; value == max(value[id == "fish"])))

标签: r dplyr tidyverse


【解决方案1】:

您可以使用包pipeR 在一行中完成这两项操作。

library(pipeR); library(dplyr)
df <- df %>>% filter(id == "fish") %>>% top_n(1) %>>% (~ df2) %>% anti_join(df, .)
print(df2)
#### 1  fish 124.3715
print(df)
#### 1 mouse  58.21857
#### 2   dog 179.76404
#### 3  fish  58.97658
#### 4   cat  68.67731
#### 5   cat 109.18217
#### 6  fish 116.47539

我不是pipeR 的专家,所以你可以看看here,这种管道内的分配实际上是如何工作的。

只有一点:使用top_n时,我建议指定值列,默认情况下它是最后一列但你很容易忘记它:top_n(1, value)

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 2018-01-07
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多