2014-12-03 92 views
0

創建多個新的矢量我有一個向量d和創建從d這樣的新載體,其新矢量包含d的每第m個元素:從原始矢量

v<-d[seq(1,length(d),m)] 

下一步我想以計算總和

s<-sum(abs(v[1:(length(v)-1)]-v[2:length(v)])) 

如果我用很少的m值做這件事,這將是沒有問題的。但是,如果我的m值超過50,那麼一個接一個地執行此操作將不會是一種理想的方式。我想概括一下創建v的方式與m的不同值相對應。以下是我想出了代碼:

d1<-rnorm(20) 
m<-seq(1,10,1) 
v<-matrix(rep(0,length(d1)*lenght(m)),nrow=length(m)) 
for (i in 1:length(m)){v[i,]<-d1[seq(1,length(d1),m[i])]} 

但是當我運行的代碼,以下錯誤出現:

Error in v[i, ] <- d1[seq(1, length(d1), m[i])] : 
number of items to replace is not a multiple of replacement length 

所以,我想另一種方式:

v<-rep(0,length(d1)) 
for (i in 1:length(m)){v<-d1[seq(1,length(d1),m[i])]} 

但是這個代碼只給出了在m = m [length(m)]處的v的值,而不是與m [1]到m [length(m)]對應的所有向量v。任何人都可以爲我提供一個解決這個問題的函數/方法嗎?

很多感謝

+0

如果您發佈了輸入數據和期望輸出數據的(小而簡化的!)示例,這將有所幫助。 – mmuurr 2014-12-03 01:16:57

回答

1

我想你也許試圖做到這一點:

for (i in 1:length(m)){assign(paste0("v",i), d1[ seq(1, length(d1), m[i])] } 

我的意見......沒有。您應該學習構建列表:

vres <- lapply(seq_along(m) , 
        function(i) d1[ seq(1, length(d1), m[i])]) 
+0

感謝@BondedDust,這個工作完美,我可以用'vres'做很多事情。我真的應該學習如何構建列表,因爲在許多情況下,它比循環更好。再次感謝給我提供了很好的建議,幫助我改進了與R的經驗 – Ocean 2014-12-03 21:47:55

1

我儘量避免for循環和使用apply家人來代替。你的函數產生一串不同長度的矢量,我把它們合併成一個列表。數據框和矩陣都必須是偶數或非破碎的,所以我必須用NA s填充你的矢量,然後我將它們綁定。

這是行不通的?

set.seed(2001) 
d1 <- rnorm(20) 
m <- seq(1, 10, 1) 
ragged <- lapply(m, FUN=function(x) d1[seq(1, length(d1), x)]) 
maximum <- max(sapply(ragged, length)) 
even <- lapply(ragged, FUN=function(x) { 
       xx <- rep(NA, maximum) 
       xx[seq(length(x))] <- x 
       xx 
}) 
even1 <- do.call(cbind, even) 
+0

感謝@RichardHerron,它完美地創建了矩陣even1,每列都是從d1派生出來的新向量。但是,當我嘗試執行以下操作時:'s <-apply(even1,2,sum)',它將僅返回第一列的總和,並且對於其餘列的總和包含NA,則返回NA。所以我試着選擇所有不是NA的元素:'s <-apply(even1,2,function(v)v [!is.na(v)])'並且應用'<-apply(even1,2 ,sum)',但我仍然得到與以前相同的結果。 – Ocean 2014-12-03 21:43:57

+0

@Ocean你需要傳遞na.rm = TRUE作爲sum()的一個選項。你也可以使用sapply(衣衫襤褸,總和)。 – 2014-12-03 23:10:10

+0

'@Richard Herron'yes,傻我,現在有用。感謝您的幫助 – Ocean 2014-12-04 01:34:45