Discussion:
[Rcpp-devel] howto access elements of a DataFrame ?
Wasilios Goutas
2017-05-28 21:02:15 UTC
Permalink
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)
Qiang Kou
2017-05-29 18:21:10 UTC
Permalink
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)
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
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
--
Qiang Kou
***@umail.iu.edu
School of Informatics and Computing, Indiana University
Wasilios Goutas
2017-05-29 19:46:32 UTC
Permalink
Hi KK,

thank you. This helped a lot. Also the stream operators is something I was also looking for :)
bye
Wasili
Post by Qiang Kou
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)
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
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel <https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel>
--
Qiang Kou
School of Informatics and Computing, Indiana University
Loading...