The R markdown is available from the pulldown menu for Code
at the upper-right, choose “Download Rmd”, or download
the Rmd from GitHub.
This vignette will show you how to import a data.frame of node
attributes into Cytoscape as Node Table columns. The same approach works
for edge and network attriubutes.
Installation
if(!"RCy3" %in% installed.packages()){
install.packages("BiocManager")
BiocManager::install("RCy3")
}
library(RCy3)
Required Software
The whole point of RCy3 is to connect with Cytoscape. You will need
to install and launch Cytoscape:
Always Start with a Network
When importing data, you are actually performing a merge function of
sorts, appending columns to nodes (or edges) that are present in the
referenced network. Data that do not match elements in the network are
effectively discarded upon import.
So, in order to demonstrate data import, we first need to have a
network. This command will import network files in any of the supported
formats (e.g., SIF, GML, XGMML, etc).
sif <- system.file("extdata","galFiltered.sif",package="RCy3")
importNetworkFromFile(sif)
You should now see a network with just over 300 nodes. If you look at
the Node Table, you’ll see that there are no attributes other than node
names. Let’s fix that…
Import Data
You can import data into Cytoscape from any data.frame in R as long
as it contains row.names (or an arbitrary column) that match a Node
Table column in Cytoscape. In this example, we are starting with a
network with yeast identifiers in the “name” column. We also have a CSV
file with gene expression data values keyed by yeast identifiers
here:
csv <- system.file("extdata","galExpData.csv", package="RCy3")
data <- read.csv(csv, stringsAsFactors = FALSE)
Note: there may be times where your network and data
identifers are of different types. This calls for identifier mapping.
RCy3 provides a function to perform ID mapping in
Cytoscape:
Check out the Identifier mapping vignette for detailed
examples.
Now we have a data.frame that includes our identifiers in a column
called “name”, plus a bunch of data columns. Knowing our key columns, we
can now perform the import:
loadTableData(data,data.key.column="name")
If you look back at the Node Table, you’ll now see that the
corresponding rows of our data.frame have been imported as new
columns.
Note: we relied on the default values for table (“node”) and
table.key.column (“name”), but these can be specified as well. See help
docs for parameter details.
LS0tCnRpdGxlOiAiSW1wb3J0aW5nIGRhdGEiCmF1dGhvcjogImJ5IEFsZXhhbmRlciBQaWNvIgpwYWNrYWdlOiBSQ3kzCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJub25lIgojICBwZGZfZG9jdW1lbnQ6CiMgICAgdG9jOiB0cnVlIAp2aWduZXR0ZTogPgogICVcVmlnbmV0dGVJbmRleEVudHJ5ezA0LiBJbXBvcnRpbmcgZGF0YSB+NSBtaW59CiAgJVxWaWduZXR0ZUVuZ2luZXtrbml0cjo6cm1hcmtkb3dufQogICVcVmlnbmV0dGVFbmNvZGluZ3tVVEYtOH0KLS0tCmBgYHtyLCBlY2hvID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBldmFsPUZBTFNFCikKYGBgCipUaGUgUiBtYXJrZG93biBpcyBhdmFpbGFibGUgZnJvbSB0aGUgcHVsbGRvd24gbWVudSBmb3IqIENvZGUgKmF0IHRoZSB1cHBlci1yaWdodCwgY2hvb3NlICJEb3dubG9hZCBSbWQiLCBvciBbZG93bmxvYWQgdGhlIFJtZCBmcm9tIEdpdEh1Yl0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2N5dG9zY2FwZS9jeXRvc2NhcGUtYXV0b21hdGlvbi9tYXN0ZXIvZm9yLXNjcmlwdGVycy9SL25vdGVib29rcy9JbXBvcnRpbmctZGF0YS5SbWQpLioKCjxociAvPgoKVGhpcyB2aWduZXR0ZSB3aWxsIHNob3cgeW91IGhvdyB0byBpbXBvcnQgYSBkYXRhLmZyYW1lIG9mIG5vZGUgYXR0cmlidXRlcyBpbnRvIEN5dG9zY2FwZSBhcyBOb2RlIFRhYmxlIGNvbHVtbnMuIFRoZSBzYW1lIGFwcHJvYWNoIHdvcmtzIGZvciBlZGdlIGFuZCBuZXR3b3JrIGF0dHJpdWJ1dGVzLiAgCgojIEluc3RhbGxhdGlvbgpgYGB7cn0KaWYoISJSQ3kzIiAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpKXsKICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikKICAgIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJSQ3kzIikKfQpsaWJyYXJ5KFJDeTMpCmBgYAoKIyBSZXF1aXJlZCBTb2Z0d2FyZQpUaGUgd2hvbGUgcG9pbnQgb2YgUkN5MyBpcyB0byBjb25uZWN0IHdpdGggQ3l0b3NjYXBlLiBZb3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgYW5kIGxhdW5jaCBDeXRvc2NhcGU6IAoKKiBEb3dubG9hZCB0aGUgbGF0ZXN0IEN5dG9zY2FwZSBmcm9tIGh0dHA6Ly93d3cuY3l0b3NjYXBlLm9yZy9kb3dubG9hZC5waHAKKiBDb21wbGV0ZSBpbnN0YWxsYXRpb24gd2l6YXJkCiogTGF1bmNoIEN5dG9zY2FwZSAKCmBgYHtyfQpjeXRvc2NhcGVQaW5nKCkKYGBgCgojIEFsd2F5cyBTdGFydCB3aXRoIGEgTmV0d29yawpXaGVuIGltcG9ydGluZyBkYXRhLCB5b3UgYXJlIGFjdHVhbGx5IHBlcmZvcm1pbmcgYSBtZXJnZSBmdW5jdGlvbiBvZiBzb3J0cywgYXBwZW5kaW5nIGNvbHVtbnMgdG8gbm9kZXMgKG9yIGVkZ2VzKSB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSByZWZlcmVuY2VkIG5ldHdvcmsuIERhdGEgdGhhdCBkbyBub3QgbWF0Y2ggZWxlbWVudHMgaW4gdGhlIG5ldHdvcmsgYXJlIGVmZmVjdGl2ZWx5IGRpc2NhcmRlZCB1cG9uIGltcG9ydC4KClNvLCBpbiBvcmRlciB0byBkZW1vbnN0cmF0ZSBkYXRhIGltcG9ydCwgd2UgZmlyc3QgbmVlZCB0byBoYXZlIGEgbmV0d29yay4gVGhpcyBjb21tYW5kIHdpbGwgaW1wb3J0IG5ldHdvcmsgZmlsZXMgaW4gYW55IG9mIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cyAoZS5nLiwgU0lGLCBHTUwsIFhHTU1MLCBldGMpLgpgYGB7cn0Kc2lmIDwtIHN5c3RlbS5maWxlKCJleHRkYXRhIiwiZ2FsRmlsdGVyZWQuc2lmIixwYWNrYWdlPSJSQ3kzIikKaW1wb3J0TmV0d29ya0Zyb21GaWxlKHNpZikKYGBgCgo8Y2VudGVyPgohW10oaHR0cHM6Ly9jeXRvc2NhcGUuZ2l0aHViLmlvL2N5dG9zY2FwZS1hdXRvbWF0aW9uL2Zvci1zY3JpcHRlcnMvUi9ub3RlYm9va3MvZGF0YS9pbWcvZ2FsZmlsdGVyZWRzaWYucG5nKXt3aWR0aD02MCV9CjwvY2VudGVyPgoKWW91IHNob3VsZCBub3cgc2VlIGEgbmV0d29yayB3aXRoIGp1c3Qgb3ZlciAzMDAgbm9kZXMuIElmIHlvdSBsb29rIGF0IHRoZSBOb2RlIFRhYmxlLCB5b3UnbGwgc2VlIHRoYXQgdGhlcmUgYXJlIG5vIGF0dHJpYnV0ZXMgb3RoZXIgdGhhbiBub2RlIG5hbWVzLiBMZXQncyBmaXggdGhhdC4uLgoKIyBJbXBvcnQgRGF0YQpZb3UgY2FuIGltcG9ydCBkYXRhIGludG8gQ3l0b3NjYXBlIGZyb20gYW55IGRhdGEuZnJhbWUgaW4gUiBhcyBsb25nIGFzIGl0IGNvbnRhaW5zIHJvdy5uYW1lcyAob3IgYW4gYXJiaXRyYXJ5IGNvbHVtbikgdGhhdCBtYXRjaCBhIE5vZGUgVGFibGUgY29sdW1uIGluIEN5dG9zY2FwZS4gSW4gdGhpcyBleGFtcGxlLCB3ZSBhcmUgc3RhcnRpbmcgd2l0aCBhIG5ldHdvcmsgd2l0aCB5ZWFzdCBpZGVudGlmaWVycyBpbiB0aGUgIm5hbWUiIGNvbHVtbi4gV2UgYWxzbyBoYXZlIGEgQ1NWIGZpbGUgd2l0aCBnZW5lIGV4cHJlc3Npb24gZGF0YSB2YWx1ZXMga2V5ZWQgYnkgeWVhc3QgaWRlbnRpZmllcnMgaGVyZToKYGBge3J9CmNzdiA8LSBzeXN0ZW0uZmlsZSgiZXh0ZGF0YSIsImdhbEV4cERhdGEuY3N2IiwgcGFja2FnZT0iUkN5MyIpCmRhdGEgPC0gcmVhZC5jc3YoY3N2LCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmBgYAoKKipOb3RlOiB0aGVyZSBtYXkgYmUgdGltZXMgd2hlcmUgeW91ciBuZXR3b3JrIGFuZCBkYXRhIGlkZW50aWZlcnMgYXJlIG9mIGRpZmZlcmVudAp0eXBlcy4gVGhpcyBjYWxscyBmb3IgaWRlbnRpZmllciBtYXBwaW5nLiBSQ3kzIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gcGVyZm9ybQpJRCBtYXBwaW5nIGluIEN5dG9zY2FwZToqKgpgYGB7cn0KP21hcFRhYmxlQ29sdW1uCmBgYApDaGVjayBvdXQgdGhlICpJZGVudGlmaWVyIG1hcHBpbmcqIHZpZ25ldHRlIGZvciBkZXRhaWxlZCBleGFtcGxlcy4KCk5vdyB3ZSBoYXZlIGEgZGF0YS5mcmFtZSB0aGF0IGluY2x1ZGVzIG91ciBpZGVudGlmaWVycyBpbiBhIGNvbHVtbiBjYWxsZWQgIm5hbWUiLCBwbHVzIGEgYnVuY2ggb2YgZGF0YSBjb2x1bW5zLiBLbm93aW5nIG91ciBrZXkgY29sdW1ucywgd2UgY2FuIG5vdyBwZXJmb3JtIHRoZSBpbXBvcnQ6CmBgYHtyfQpsb2FkVGFibGVEYXRhKGRhdGEsZGF0YS5rZXkuY29sdW1uPSJuYW1lIikKYGBgCjxjZW50ZXI+CiFbXShodHRwczovL2N5dG9zY2FwZS5naXRodWIuaW8vY3l0b3NjYXBlLWF1dG9tYXRpb24vZm9yLXNjcmlwdGVycy9SL25vdGVib29rcy9kYXRhL2ltZy9nYWxmaWx0ZXJlZGRhdGEucG5nKXt3aWR0aD02MCV9CjwvY2VudGVyPgoKSWYgeW91IGxvb2sgYmFjayBhdCB0aGUgTm9kZSBUYWJsZSwgeW91J2xsIG5vdyBzZWUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyByb3dzIG9mIG91ciBkYXRhLmZyYW1lIGhhdmUgYmVlbiBpbXBvcnRlZCBhcyBuZXcgY29sdW1ucy4KCioqTm90ZTogd2UgcmVsaWVkIG9uIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGFibGUgKCJub2RlIikgYW5kIHRhYmxlLmtleS5jb2x1bW4gKCJuYW1lIiksIGJ1dCB0aGVzZSBjYW4gYmUgc3BlY2lmaWVkIGFzIHdlbGwuIFNlZSBoZWxwIGRvY3MgZm9yIHBhcmFtZXRlciBkZXRhaWxzLioqCmBgYHtyfQo/bG9hZFRhYmxlRGF0YQpgYGAKCgo=