在其他数据框中排序和查找值

时间:2011-09-08 09:05:53

标签: r sorting

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

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

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

我知道如何找到每行的值的位置以及which.min和which.max。但我不知道如何把它放在循环中以便为所有403行执行此操作。然后,如何使用此数据在其他数据框commodities_3_returns中找到相应的数据。


不幸的是我必须使用数据帧,因为我在那里有日期作为rownames,我必须保留它,因为我以后需要它们用于索引,以及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))

2 个答案:

答案 0 :(得分:2)

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

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]]
}

答案 1 :(得分:1)

以下是使用内部min函数的max获取max.colC的替代方法。如果您拥有大型数据集,则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