Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting row names on a tibble is deprecated. Error: invalid 'row.names' length

I am trying to make a heatmap of a sites vs. species abundances matrix. With thanks to Maurits Evers for some of this code, I am still not able to run it without the error message:

Setting row names on a tibble is deprecated.Error in row.names<-.data.frame(*tmp*, value = list(Site = c("AwarukuLower", : invalid 'row.names' length

It was suggested tidyverse & tibbles may be the issue. I uninstalled packages tibble & tidyverse and installed the devtools readr package instead. I am still getting the same error message and can't figure out how to fix this. Data attached.

library(readr)
devtools::install_github("tidyverse/readr") #to install readr without tidyverse

bank_mean_wide_sp <- read.csv("/Users/Chloe/Desktop/Environmental Data Analysis/EDA.working.directory/bank_mean_wide.csv")
log_mean_wide_sp <- read_csv("/Users/Chloe/Desktop/Environmental Data Analysis/EDA.working.directory/log_mean_wide.csv")

as.matrix(bank_mean_wide_sp)
as.matrix(log_mean_wide_sp)

Store Site information as rownames

logdf <- log_mean_wide_sp;
base::row.names(logdf) <- log_mean_wide_sp[, 1];

Remove non-numeric column

logdf <- logdf[, -1];

Use as.matrix to convert data.frame to matrix

logmap <- heatmap(
as.matrix(logdf),
col = cm.colors(256),
scale = "column",
margins = c(5, 10),
xlab = "species", ylab = "Site",
main = "heatmap(<Auckland Council MCI data 1999, habitat:bank>, ..., scale = \"column\")")

Returns the error message as mentioned above:

Setting row names on a tibble is deprecated.Error in row.names<-.data.frame(*tmp*, value = list(Site = c("AwarukuLower", : invalid 'row.names' length

Alternatively, I tried to run the code without first 3 lines, and used as.numeric and as.matrix to convert data.frame to numeric matrix. This also did not work.

as.matrix(logdf) 
logmap <- heatmap(as.numeric(logdf),
col = cm.colors(256),
scale = "column",
margins = c(5, 10),
xlab = "species", ylab = "Site",
main = "heatmap(<Auckland Council MCI data 1999, habitat:bank>, ..., scale = \"column\")")

Returns this second error:

Error in heatmap(as.numeric(logdf), col = cm.colors(256), scale = "column", : (list) object cannot be coerced to type 'double'

like image 832
chloep Avatar asked May 04 '18 03:05

chloep


People also ask

How do I set row names in R?

Method 1 : using rownames() A data frame's rows can be accessed using rownames() method in the R programming language. We can specify the new row names using a vector of numerical or strings and assign it back to the rownames() method.

Can Tibbles have row names?

While a tibble can have row names (e.g., when converting from a regular data frame), they are removed when subsetting with the [ operator. A warning will be raised when attempting to assign non- NULL row names to a tibble.

What is the difference between Tibble and Dataframe in R?

Tibbles vs data frames There are two main differences in the usage of a data frame vs a tibble: printing, and subsetting. Tibbles have a refined print method that shows only the first 10 rows, and all the columns that fit on screen. This makes it much easier to work with large data.

What is Tibbles?

Tibbles are data. frames that are lazy and surly: they do less (i.e. they don't change variable names or types, and don't do partial matching) and complain more (e.g. when a variable does not exist). This forces you to confront problems earlier, typically leading to cleaner, more expressive code.


2 Answers

Your error messages has 2 parts

  1. Setting row names on a tibble is deprecated.

This means setting row names on tibble is deprecated. It still works as of now but will be removed in future. See this https://github.com/tidyverse/tibble/issues/123.

  1. Error in row.names<-.data.frame(*tmp*, value = list(Site = c("AwarukuLower", : invalid 'row.names' length

This is error saying that the length of row.names that you are setting is not equal to total no of rows you have in your data frame.

The error is in reading your csv file, your csv file has first column as row name but you are reading it as normal column. Read it correctly by using

log_mean_wide_sp<-read.csv("log_mean_wide.csv",row.names = 1)

Then do the below steps as you are doing

logdf<-log_mean_wide_sp
logmap <- heatmap(
as.matrix(logdf),
col = cm.colors(256),
scale = "column",
margins = c(5, 10),
xlab = "species", ylab = "Site",
main = "heatmap(<Auckland Council MCI data 1999, habitat:bank>, ..., scale = \"column\")")

It will give below image as output

enter image description here

like image 80
Dhawal Kapil Avatar answered Sep 24 '22 13:09

Dhawal Kapil


I would recommend creating a matrix version of the numeric part of your data frame:

log_mean_mat <- as.matrix(log_mean_wide_sp[,-1])

You shouldn't have issues setting the row-names for this:

row.names(log_mean_mat) <- log_mean_wide_sp[,1]

I personally strongly prefer the heatmap.2 function for heatmaps (in the gplots package) over the base function, but here's what should work using the base code:

heatmap(log_mean_mat,
  col = cm.colors(256),
  scale = "column",
  margins = c(5, 10),
  xlab = "species", ylab = "Site",
  main = "heatmap(<Auckland Council MCI data 1999, habitat:bank>, ..., scale = \"column\")")

Site         Acarina Acroperla Amphipoda Austroclima Austrolestes Ceratopogonidae 
AwarukuLower    0   0   1   0   0   0   
AwarukuMid      1   20  6   0   0   0   
NukumeaLower    0   44  1   0   0   1   
NukumeaUpper    1   139 9   2   1   0   
VaughanLower    1   110 112 1   0   0   
VaughanMid      2   44  12  2   1   0   
like image 42
Melissa Key Avatar answered Sep 25 '22 13:09

Melissa Key