【问题标题】:Subset number of rows per group based on a value in another dataframe基于另一个数据帧中的值的每组的子集行数
【发布时间】:2020-10-05 06:30:22
【问题描述】:

我已经阅读了类似的问题,但我的问题略有不同。我有一个数据框 (df1),其中包含超过 300 万行、1874 个物种(科学名称)和总值。

我还有另一个数据框 (df2),它提供了我想为每个物种保留的行数(总共大约 200 万行)。

我想做的是根据 df2 中指定的行数对 df1 进行子集/过滤,只保留总值最高的那些行。例如。假设 df2 n.at.70 = 1104(而不是 1)中的 Cypraeidae,所以我希望得到的 df 保留 1104 行,从最高总值到该物种的第 1104 最高总值(科学名称)。

我无法为一个物种实现这一点,更不用说想出一个有效的“应用”或“for”循环,所以任何帮助都将不胜感激,我对 R 比较陌生。

【问题讨论】:

  • See here 关于制作一个更易于人们帮助的可重现示例,包括一个可行的数据样本,而不是图片。目前尚不清楚您要做什么,主要是因为您包含的 2 张数据图片似乎没有重现问题

标签: r filter dplyr group-by subset


【解决方案1】:

听起来您正在处理大型数据集 - data.table 解决方案可能更快、更可取。

一种方法是将n.at.70 的值合并到df1,按total 的降序排列,然后使用head 显示顶部的n.at.70 结果。

library(data.table)

setDT(df1)
setDT(df2)

setkey(df1, scientific_name)
setkey(df2, scientific_name)

df2[df1, on = "scientific_name"][
  order(-total), head(.SD, n.at.70[1]), by = scientific_name]

tidyverse 等效项可能如下:

library(tidyverse)

df1 %>%
  left_join(df2) %>%
  group_by(scientific_name) %>%
  arrange(scientific_name, desc(total)) %>%
  slice(1:n.at.70[1])

【讨论】:

  • 非常感谢,tidyverse 相当出色。我只是在阅读有关 slice 的内容,非常好用!
  • 您也可以查看top_n
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多