Я пытаюсь преобразовать цикл for
, написанный на R, в C ++ для использования с Rcpp
; в частности, функция типа apply с транспонированием.
Функция берет файл .gen
и преобразует его в аллели:
Я прочитал "Начало работы Ника" с Rcpp и большую часть Масаки Э. Цуда Rcpp4Everyone и https://thecoatlessprofessor.com/programming/unofficial-rcpp-api-documentation/#vmld, чтобы узнать, где я сейчас нахожусь.
Это код R
:
library(tidyverse)
geno <- data.frame(x1 = c(1,1,1),
x2 = c("rs001", "rs002", "rs003"),
x3 = c(224422,225108,225167),
x4 = c("T","A", "G"),
x5 = c("C", "C", "A"),
x6 = c(1,1,1),
x7 = c(0,0,0),
x8 = c(0,0,0),
x9 = c(1,0,1),
x10 = c(0,1,0),
x11 = c(0,0,0),
stringsAsFactors = F)
# What I'd like to turn into C++
geno_to_alleles <- function(geno) {
# Pre-allocate final output - always initialize output variable to required length and data type
tmp = matrix(nrow = (ncol(geno)-5)/3, ncol = nrow(geno), byrow= T)
#j is subject index
j =1
for (i in seq(from=6,to=ncol(geno), by=3)){
tmp[j,1:nrow(geno)] <- t(apply(geno[, i:(i+2)], 1, paste, collapse = ""))
j = j + 1
}
return(tmp)
}
df_out <- geno_to_alleles(df)
В результате получается matrix
, который выглядит следующим образом:
[,1] [,2] [,3]
[1,] "100" "100" "100"
[2,] "100" "010" "100"
Пока у меня есть следующий код C ++, который читает DataFrame
и создает ComplexMatrix
объект, который будет варьироваться в зависимости от размера ввода DataFrame
.
Мне нужна помощь в переносе следующего кода в C ++ tmp[j,1:nrow(geno)] <- t(apply(geno[, i:(i+2)], 1, paste, collapse = ""))
:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame modifyDataFrame(DataFrame df) {
int input_rows = df.nrow(); // output
int input_cols = df.ncol();
Rcout << "Input DataFrame df has " << input_rows << " rows and " << input_cols << " columns." << std::endl;
int total_rows = (input_cols-5)/3;
ComplexMatrix tmp(total_rows, input_rows);
Rcout << "Output ComplexMatrix tmp has " << total_rows << " rows and " << input_rows << " columns." << std::endl;
// Below needs to be transpiled into C++
//tmp[j,1:nrow(df)] <- t(apply(df[, i:(i+2)], 1, paste, collapse = ""))
// return the new data frame
return tmp;
}