2011-09-08 47 views
3

我有一個名爲commodities_3的數據框。它包含28列不同商品和403行代表月末數據。我需要的是找到單獨的每一行的位置:排序和查找其他數據幀中的值

  • 最大值,
  • 最小值,
  • 所有其他陽性
  • 所有其他底片

這些指標應該再用於在具有相同列和行特徵的另一個數據幀中定位相應數據,稱爲commodities_3_returns。然後應將這些數據複製到4個新的數據幀中(每個排序一個數據幀)。

我知道如何找到每行使用which和which.min和which.max的值的位置。但我不知道如何把它放在一個循環中,以便爲所有403行做到這一點。並隨後如何使用這些數據來定位其他數據幀中的相應數據commodities_3_returns


Unfortunaltey我不得不使用一個數據幀,因爲我有日期在那裏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

您可以通過給我們一個重複的例子開始。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example它也可以幫助我們,如果你告訴我們輸出應該是什麼樣子。 –

+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。在沒有咖啡,我的大腦只用一個笨重的解決方案循環

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

這是一種替代方法,以獲得min和使用max.col這是一個內部功能Cmax。如果你有一個大的數據集,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 
相關問題