I tej linii kodu r:przepisywanie powolne funkcję R C++ i RCPP
croppedDNA <- completeDNA[,apply(completeDNA,2,function(x) any(c(FALSE,x[-length(x)]!=x[-1])))]
co robi to identyfikacji miejsc (cols) w matrycy z sekwencjami DNA (1 wiersz = z SEK), który nie są uniwersalne (informacyjne) i dzielą je z macierzy, aby utworzyć nową "matrycę przyciętą", tj. pozbyć się wszystkich kolumn, w których wartości są takie same. W przypadku dużego zbioru danych zajmuje to około 6 sekund. Nie wiem, czy mogę to zrobić szybciej w C++ (wciąż początkującym w C++), ale dobrze będzie, jeśli spróbuję. Moim pomysłem jest użycie Rcpp, zapętlenie w kolumnach CharacterMatrix, wyciągnięcie kolumny (witryny) jako sprawdzenia CharacterVector, jeśli są one takie same. Jeśli są takie same, zapisz numer kolumny/indeks, kontynuuj dla wszystkich kolumn. Następnie na końcu utwórz nowy CharacterMatrix, który obejmuje tylko te kolumny. Ważne jest, aby zachować rownames i nazwy kolumn tak, jak są one w "wersji R" macierzy, tj. Jeśli kolumna idzie, tak samo jak nazwa kolumny.
Pisałem przez około dwie minuty, do tej pory, co mam jest (nie skończony):
#include <Rcpp.h>
#include <vector>
using namespace Rcpp;
// [[Rcpp::export]]
CharacterMatrix reduce_sequences(CharacterMatrix completeDNA)
{
std::vector<bool> informativeSites;
for(int i = 0; i < completeDNA.ncol(); i++)
{
CharacterVector bpsite = completeDNA(,i);
if(all(bpsite == bpsite[1])
{
informativeSites.push_back(i);
}
}
CharacterMatrix cutDNA = completeDNA(,informativeSites);
return cutDNA;
}
Czy będę właściwą drogę na ten temat? Czy istnieje prostszy sposób. Rozumiem, że potrzebuję std :: vector, ponieważ łatwo jest je rozwijać (ponieważ nie wiem z góry ile kolczyków zamierzam zachować). Przy indeksowaniu będę musiał dać +1 do wektora informacyjnegoSites na końcu (ponieważ R indeksuje od 1 i C++ od 0)?
dzięki, ben W.
Dobry start, ale nie można używać ujemnych indeksów w C/C++ ... –
@DirkEddelbuettel, Tak, możesz, pod warunkiem, że używasz tego, co używasz, zaczyna się w środku tablicy lub przeciąża go, aby poradzić sobie z negatywy. Na przykład: int arr [] = {1, 2, 3, 4, 5}; int * mid = i arr [2]; int x = mid [-1]; // x = 2' – chris
czy możesz potwierdzić, że 'class (completeDNA)' to 'matrix', a nie' data.frame'. "apply" jest powolne i może nastąpić prosta poprawa do twojego kodu R przed skokiem do C++. – flodel