[Rcpp-devel] howto access elements of a DataFrame ?

Qiang Kou qkou at umail.iu.edu
Mon May 29 20:21:10 CEST 2017


Hi, Wasilios,

I modified your code a little and paste below. I hope this helps.

Best,

KK


df <- data.frame(first=c("a","A", "aA"), second=c("b","B","bB"),
third=rep(c("c","C","cC"),4))
PLAYGROUND = new.env()
PLAYGROUND$testData <- split(df, df$first)

src_4='
Rcpp::Environment e(env);
Rcpp::List splitted ( e["testData"] );
Rprintf("splitted contains %d entries \\n", splitted.size());
for(int i = 0; i< splitted.size(); i++){
  Rcpp::DataFrame df(splitted[i]);
  Rcpp::Rcout << "element " << i << " has " << df.nrow() << " rows " <<
df.ncol() << " cols" << std::endl;
  Rcpp::CharacterVector df_names = df.names();
  Rcpp::Rcout << "col names: " << df_names << std::endl;
  Rcpp::CharacterVector v = df[0];
  Rcpp::Rcout << v << std::endl;
}
return splitted;
'

library(inline)

fun_4 <- cxxfunction(sig=signature(env="environment"), body = src_4, plugin
= "Rcpp")
ret_4 <- fun_4(PLAYGROUND)


On Sun, May 28, 2017 at 2:02 PM, Wasilios Goutas <wasili at goutas.de> wrote:

> Hi,
>
> I’m pretty new to Rcpp and tried some examples and was surprised how nice
> C++ can be included in R code :)
>
> Currently I’m struggling with accessing the Elements of data.frames in C++
> and hope you will give me a hint on how to get the values expected out of
> it.
>
> Below is an example I created to learn how to access the values out of a
> splitter data.frame.
> As you can see I use an environment object as parameter containing a
> splitted data.frame with the name ‚testData‘ in it.
> What I try to do is accessing the elements of the splitter data.frame one
> by one, but I’m not sure what kind of object type they are. It should be a
> kind of List (which seems to be a Vector in Rcpp) but I’m not sure.
> I read that a DataFrame is a list of vectors which all have the same
> length. but I was not able to find any information on how to get the column
> names and how to access the elements of the DataFrame object.
>
> It would be very nice if you could show me based on this code how to
> access the elements of the splitter data.frame in C++ and maybe also the
> column names :)
> Thanks in advance
> Wasili
>
>
> (the commented lines crashes R ones uncommented)
>
> df <- data.frame(first=c("a","A", "aA"), second=c("b","B","bB"),
> third=rep(c("c","C","cC"),4))
> PLAYGROUND = new.env()
> PLAYGROUND$testData <- split(df, df$first)
>
> src_4='
>   Rcpp::Environment e(env);
>   Rcpp::List splitted ( e["testData"] );
>   Rprintf("splitted contains %d entries \\n", splitted.size());
>   for(int i = 0; i< splitted.size(); i++){
>     Rprintf("typeof splitted[%d] = %s \\n", i, typeid(splitted[i]).name());
>     Rcpp::DataFrame df = Rcpp::as<Rcpp::DataFrame>(splitted[i]);
> //    Rprintf("typeof df = %s \\n", i, typeid(df).name());
>     Rprintf(" element %d has %d rows \\n", i, df.nrow());
>     for(int k=0; k < df.nrow(); k++){
> //      Rcpp::GenericVector v = df[k];
> //      Rprintf("typeof v = %s \\n", typeid(v).name());
> //      Rprintf(" row [%d] = %s \\n", k, df[k]);
>     }
>   }
>   return splitted;
> '
> rm(fun_4)
> fun_4 <- cxxfunction(sig=signature(env="environment"), body = src_4,
> plugin = "Rcpp")
> ret_4 <- fun_4(PLAYGROUND)
>
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel




-- 
Qiang Kou
qkou at umail.iu.edu
School of Informatics and Computing, Indiana University
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20170529/65ca98e7/attachment.html>


More information about the Rcpp-devel mailing list