我有一个名为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))
答案 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.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