【问题标题】:data.frame into matrix (R) , rownames() errordata.frame 转换为矩阵 (R) ,rownames() 错误
【发布时间】:2017-05-23 23:36:36
【问题描述】:

我有一个 93 x 28 的 data.frame ("data.csv") 我想将其转换为矩阵以进一步绘图,它看起来像这样:

SYMBOL  BT.20   CAL.51  MDA.MB.436  BT.549
A   3.039   4.908   3.865   3.818
B   4.349   5.399   6.071   5.313
C   7.509   8.091   6.48    6.660
D   3.429   4.394   3.622   3.873
E   3.369   6.716   3.557   3.346

代码

data <- read_csv("data.csv")
rnames <- data[,1]              # assign labels in column 1 to "rnames"  
mat_data <- data.matrix(data[,2:28])  # transform column 2 - end into a matrix
rownames(mat_data) <- rnames                  # assign row names

生产

ERROR: Error in `rownames<-`(`*tmp*`, value = list(SYMBOL = c("A", "B",  : 
  length of 'dimnames' [1] not equal to array extent

第 1 列没有重复名称或缺失值

编辑: 用read.csv() 代替,它工作得很好

【问题讨论】:

  • 你应该调试你的代码。添加print(rnames)
  • 或者你可以发布str(rnames)str(mat_data)的结果。好像是维度问题
  • 你试过read.csv("data.csv", row.names = 1)吗?它在read.csv 中分配它们。
  • 感谢大家的帮助,实际上我正在使用 Rstudio 的“导入数据集”功能加载 data.frame,即 read_csv ,如果我使用 read.csv( ) 我没有得到错误。我猜他们默认情况下对标头的处理方式不同?
  • 它们是两个不同的函数。 read.csv 是基础 R 之一。

标签: r csv matrix dataframe


【解决方案1】:

错误是说分配给行名的值是一个列表,其中包含单个向量的列表的“长度”是 1,而不是向量的长度。我无法说出为什么会发生这种情况,因为通常的行为是“[”函数将单列“删除”到原子向量中。和你一样,我希望 rnames 是一个长度为 39 的原子向量,但看来你需要改用它:

rownames(mat_data) <- unlist( rnames )              # assign row names

Rich 和 Apom 的眼睛比我好。 read_csv 函数正在生成一个对象,该对象具有与read.csv 不同的类和关联的提取函数。由于您在“hadleyverse”中,因此您应该使用这个:

 rnames <- data[[1]]

tibble-classed 对象的 [-function 版本与 data.frames 不同。 [[-函数对两个类的作用似乎相同。

【讨论】:

  • 可能是由于使用了tibbledplyr 引起的:as_tibble(mtcars)[, 1] 是一个小标题,而不是一个向量。 tibble“更正”drop = TRUE"["() 的默认行为
  • 如果是这样,那么unlist 会起作用,但可以通过使用rnames &lt;- data[[1]] 作为rnames 的创建来使其变得不必要,因为"[[" 确实“删除”了维度。
  • "hadleyverse" = :-)
猜你喜欢
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2018-10-12
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多