【问题标题】:Sorting and finding values in other data frames在其他数据框中排序和查找值
【发布时间】:2011-09-08 09:05:53
【问题描述】:

我有一个名为 commodities_3 的数据框。它包含包含不同商品的 28 列和代表月末数据的 403 行。我需要的是分别找到每一行的位置:

  • 最大值,
  • 最小值,
  • 所有其他积极因素
  • 所有其他负面因素

然后应该使用这些索引来定位另一个具有相同列和行特征的数据帧中的相应数据,称为commodities_3_returns。然后应将这些数据复制到 4 个新数据帧中(每个排序一个数据帧)。

我知道如何使用 which 和 which.min 和 which.max 来查找每一行的值的位置。但我不知道如何将其放入循环中以便对所有 403 行执行此操作。以及随后如何使用这些数据在另一个数据框commodities_3_returns中定位对应的数据。


不幸的是,我必须使用数据框,因为其中有日期作为行名,我必须保留这些日期,因为以后需要它们进行索引,以及 NA。它看起来像这样:

commodities_3 <- as.data.frame(matrix(rnorm(15), nrow=5, ncol=3))
mydates <- as.Date(c("2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04", "2011-01-05"))
rownames(commodities_3) <- mydates
commodities_3[3,2] <- NA


commodities_3_returns <- as.data.frame(matrix(rnorm(15), nrow=5, ncol=3))
mydates <- as.Date(c("2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04", "2011-01-05"))
rownames(commodities_3_returns) <- mydates
commodities_3_returns[3,3] <- NA

正如我所说,我总共有 403 行和 27 列。在每一行中,我都必须保留一些 NA。 max.col 似乎无法处理 NA。

我对上述示例的期望输出是这样的:

max_values <- as.data.frame(matrix(data=c(1:5,3,2,1,3,1), nrow=5, ncol=2, byrow=F))

【问题讨论】:

  • 你可以从给我们一个可重现的例子开始。 stackoverflow.com/questions/5963269/… 如果您向我们展示输出应该是什么样子,这也会对我们有所帮助。
  • 我已将您未注册的帐户合并到您的注册帐户中。您现在可以完全控制这个问题。

标签: r sorting


【解决方案1】:

如果commodities_3 中的所有列都是数字,那么您需要一个矩阵,而不是数据框。然后使用apply 函数。一些样本数据,用于重现性。

commodities_3 <- matrix(rnorm(12), nrow = 4)
commodities_3_returns <- matrix(1:12, nrow = 4)

统计数据。

mins <- apply(commodities_3, 1, which.min)
maxs <- apply(commodities_3, 1, which.min)
pos <- apply(commodities_3, 1, function(x) which(x > 0))  #which is optional
neg <- apply(commodities_3, 1, function(x) which(x < 0))

现在在commodities_3_returns 的索引中使用这些。在没有咖啡的情况下,我的大脑只有一个带有 for 循环的笨拙解决方案

n_months <- nrow(commodities_3_returns)
min_returns <- numeric(n_months)
for(i in seq_len(n_months))
{
  min_returns[i] <- commodities_3_returns[i, mins[i]]
}

【讨论】:

    【解决方案2】:

    这是使用max.col 获取minmax 的另一种方法,max.col 是内部的C 函数。如果您有一个大型数据集,max.col 与基于 apply 的解决方案相比工作得非常快

    mins = max.col(-commodities_3)
    maxs = max.col(commodities_3)
    N    = NROW(commodities_3)
    
    commodities_3_returns[cbind(1:N, mins)] # returns min
    commodities_3_returns[cbind(1:N, maxs)] # returns max
    

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2017-03-05
      • 2020-06-16
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2021-11-22
      相关资源
      最近更新 更多