【问题标题】:Calculate the difference between max and min values of two vectors for nested subsets of those vectors计算这些向量的嵌套子集的两个向量的最大值和最小值之间的差
【发布时间】:2020-01-29 16:49:01
【问题描述】:

我有一个大约 900 行的数据框(请参阅下面的简化示例)。我正在尝试估计每年每个whaleID 的最大值(doy)-最小值(doy)的值。我需要按whaleID 和年份返回doy 差异的对象(例如表格)。一个挑战是,并非每年都包含两个“doy”观察结果。我尝试过使用“dplyr”、aggregate() 并制作一个循环(我还不能胜任设计)。如果可能的话,我想使用 Base 来实现这一点,但是对于任何关于这方面的帮助建议,我都愿意倾听,谢谢!

whaleID<-c(31,4,5,65,31,4,4,4,31,5)
year<-c(2010, 2010, 2010, 2011, 2011, 2011, 2011, 2011, 2011, 2011)
doy<-c(65,71,88,67,77,78,81,82,88,88)

【问题讨论】:

  • 如果doy 只有一行,你想如何计算差异?它应该是 0 还是相同的单个值?你能显示给定数据的预期输出吗?

标签: r loops nested


【解决方案1】:

您可以只使用aggregate() 并从range() 中减去值:

whaleID<-c(31,4,5,65,31,4,4,4,31,5)
year<-c(2010, 2010, 2010, 2011, 2011, 2011, 2011, 2011, 2011, 2011)
doy<-c(65,71,88,67,77,78,81,82,88,88)
dfx <- data.frame(whaleID, year, doy)
aggregate(dfx$doy, by = list(whaleId = dfx$whaleID, year = dfx$year),
          FUN = function(x) diff(range(x)))

  whaleId year  x
1       4 2010  0
2       5 2010  0
3      31 2010  0
4       4 2011  4
5       5 2011  0
6      31 2011 11
7      65 2011  0

【讨论】:

  • 我不确定我是否遗漏了什么,但这不是aggregate(doy~whaleID + year, df, function(x) diff(range(x))) 吗?
  • @RonakShah 是的,这是等价的。我个人喜欢by 语法与公式语法,但我想这是风格问题。 diff(range(x)) 我认为是一种改进,会更新到那个选择
猜你喜欢
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2021-06-03
相关资源
最近更新 更多