[英]How to access elements in vectors in Lists more efficiently?
我有一個問題,我想以一種特殊的方式合並所有相同類型的向量列表。 我希望所得矢量的第一個元素成為列表中第一個矢量的第一個元素,第二個元素應為第二個矢量的第一個元素,第三個,第三個的第一個,依此類推,直到n其中n是我列表的長度,則元素n + 1應該是第一個向量的第二個元素。 重復直到完成。
目前,我正在這樣做:
CharacterVector measure(nrows * expansion);
CharacterVector temp(nrows);
for(int i=0; i < measure.size(); i++){
temp = values[i % expansion];
measure[i] = temp[i / expansion];
}
return(measure);
其中values
是CharacterVectors
的List
。 這似乎效率極低,每次都會覆蓋temp
但是我不知道一種更好的方法來訪問values
的元素。 我不太了解C ++,但我認為必須有更好的方法。
任何幫助都將不勝感激!
編輯:在“所有矢量values
具有相同的長度的nrows
和values
具有expansion
在它的元件。
您需要的是ListOf<CharacterVector>
類。 顧名思義,它表示一個僅包含CharacterVector
的R列表。
下面的代碼使用它從列表中提取每個字符向量的第二個元素。 應該不難讓它適應您的擴展算法,但是如果沒有更多上下文,您的示例就無法重現。
#include <Rcpp.h>
using namespace Rcpp ;
// [[Rcpp::export]]
CharacterVector second( ListOf<CharacterVector> values ){
int n = values.size() ;
CharacterVector res(n);
for(int i=0; i<n; i++){
res[i] = values[i][1] ;
}
return res ;
}
然后,您可以sourceCpp
並嘗試一些示例數據:
> data <- list(letters, letters, LETTERS)
> second(data)
[1] "b" "b" "B"
現在關於您的假設:
這似乎效率極低,每次都覆蓋溫度
創建CharacterVector
的速度非常快,沒有數據的深層副本,因此,這首先不應該成為問題。
您可以預先構造向量,並且可以輕松知道第一個向量的元素應該移到哪個位置。即:measure [0],measure [n],measure [n * 2]等。其中n = mylist.size() 。 在這里,我當然假設列表中的每個向量都具有相等的大小。 未經測試的代碼:
CharacterVector measure(nrows * expansion);
for(int i=0; i < values.size(); ++i)
{
CharacterVector& temp = values[i];
int newPosition = i;
for( int j=0; j < temp.size(); ++j)
{
measure[newPosition ] = temp[j];
newPosition += expansion;
}
}
return(measure);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.