【问题标题】:R Can we convert a matrix whose essential is list to a matrix whose essential is character vector?R 我们可以将本质是列表的矩阵转换为本质是字符向量的矩阵吗?
【发布时间】:2018-08-15 11:37:07
【问题描述】:

矩阵是一种有维度的向量,我可以创建一个矩阵

m = matrix(list(rep(character(0),4)),nrow = 2,ncol = 2)

其本质是具有维度的列表:

str(m)
List of 4
...
- attr(*, "dim")= int [1:2] 2 2

我想把这个矩阵转换成这样的矩阵:

m = matrix(rep(character(0),4),nrow = 2,ncol = 2)

其本质是具有维度的字符向量:

str(m)
chr [1:2, 1:2] NA NA NA NA

这种转换至关重要,因为许多函数可以轻松处理向量并返回一个简单的向量,但这些函数本身不能处理列表(除非你使用 apply/lapply 给你一个列表结果,经过几次操作你得到一个列表被另一个列表包裹)

【问题讨论】:

  • 你为什么要character(0)
  • rep(character(0),4) 是一个长度为 0(不是 4)的向量,所以 matrix(rep(character(0),4),nrow = 2,ncol = 2) 没有任何意义(因此 NA)。您似乎想将有意义的东西(尽管没有动力)转换为根本没有意义的东西。请解释您要做什么。
  • 这很有可能是XY problem。也许还有另一种方法可以解决您的潜在问题,它不涉及创建NA 的矩阵。顺便说一句,我认为你的问题不应该被否决。它相当清楚(虽然有点奇怪)并且足以让其他人重现该问题。
  • 我想把list矩阵转成char矩阵,数据是我们公司的,这里放不下,所以我用character(0),你可以用matrix(list(" a","b","c","d"), nrow = 2,ncol = 2) 如果你愿意的话

标签: r list matrix


【解决方案1】:

其实我已经想出了如何将列表矩阵转换为字符矩阵: 这是我的步骤:

#initialize
m = matrix(list(rep(character(0),4)),nrow = 2,ncol = 2)
#convert to dataframe to fortify its' 2 col 2 row shape
m = as.data.frame(m)
#unlist it and fill into the 2 col 2 row shape in data.frame
m[] = lapply(m,function(x){sapply(x,function(y)
{ifelse(length(y)==1,y,NA)})})
#convert it to matrix
m = as.matrix(m)

或者说得更简单:

m2 = matrix(character(0),nrow = nrow(m),ncol = ncol(m))
m2[] = sapply(m,function(x){ifelse(length(x)==1,x,NA)})

唯一的问题是矩阵的字符(0)已经变成了NA,我认为这是一个好点,本质含义是相同的,对于NA我们有更多的方法来处理

而且@John Coleman 有一个我认为也令人难忘的观点,即一个问题可能有另一个简单的解决方法,我自己也在考虑它,如果我得到解决方案,我也会在这里发布。不过这个问题本身就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2015-01-30
    • 2014-03-09
    • 2018-03-01
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多