【问题标题】:How to split a list of vectors into columns or matrix? [closed]如何将向量列表拆分为列或矩阵? [关闭]
【发布时间】:2017-02-26 00:52:13
【问题描述】:

我有一个采用这种形式的向量列表:

> g
[[1]]
 [1] "L"  "14" "L"  "39" "L"  "61" "B"  "0"  "L"  "15" "L"  "59" "W"  "64"

[[2]]
[1] "L"  "62" "D"  "31" "L"  "10" "L"  "30" "B"  "0"  "D"  "45" "L"  "43"

[[3]]
 [1] "H"  "0"  "L"  "11" "L"  "35" "W"  "45" "H"  "0"  "L"  "40" "L"  "42"

我的目标是在这个结构上使用mapply,并将 14 列中的每一列都变成一个向量。第一列是:

[[1]]
[1] "L"

[[2]]
[1] "L"

[[3]]
[1] "H"

第二列是:

[[1]]
[1] "14"

[[2]]
[1] "62"

[[3]]
[1] "0"

等等。我怀疑该结构将是一个矩阵(?),但我不确定。我使用了很多lapplystringrstr_extract_all 和正则表达式来理解这一点,但我不确定如何继续。我怀疑该函数会使用如下模式:"[A-Z]{1}" 用于文本,"[:digit:]{1}" 我知道mapply 可以返回一个矩阵,但我不知道从哪里开始。

【问题讨论】:

  • 在这里使用正则表达式没有意义。也许解释一下这些数据的来源(例如,csv 文件、网络抓取、手动输入)以及您需要如何使用它(例如,用pkg::xyz() 绘制它)会有所帮助。 (为了清楚起见:你的第一个块是一个简单的list,其中每个元素都是一个character 向量(不是列表)。你的第二个和第三个块都是相同的:一个简单的list,每个元素都是一个@ 987654336@ 向量(长度为 1)。
  • 我不知道 R - 但我同意 @r2evans 正则表达式在这里似乎有点矫枉过正,快速搜索一下将我引向这个:stackoverflow.com/questions/8464312/… 这似乎相当接近,但我不会假装我知道 R 并尝试更改以完全适合您的情况。
  • 它只是分解文件的一大组模式中的一小部分——这只是其中的一部分。我基本上是在寻找function,它将 this 作为矩阵或一系列列表输出。
  • 有一条评论(已删除)建议do.call(rbind, g)。它将这个g 变成了一个整洁的matrix。但是你说你希望每一列都是一个向量,所以像lapply(seq_along(g[[1]]), function(i) sapply(g, [[, i)) 这样的东西给出了那个,但是你提到“返回一个矩阵”,所以我很困惑你说什么,你需要什么,你描述什么。
  • 道歉 - 我仍在研究如何描述这些结构。我可能可以使用矩阵或列表:看起来do.call(rbind, g) 也可以完美地工作并且似乎也是相同的结构。我必须阅读do.call(rbind, ...) - 谢谢!

标签: r regex data-conversion mapply


【解决方案1】:

这是一个使用 mapply 的解决方案

g <- list()
g[[1]] <- c("L",  "14", "L",  "39", "L",  "61", "B",  "0",  "L",  "15", "L",  "59", "W",  "64")
g[[2]] <- c("L",  "62", "D",  "31", "L",  "10", "L",  "30", "B",  "0",  "D",  "45", "L",  "43")
g[[3]] <- c("H",  "0",  "L",  "11", "L",  "35", "W",  "45", "H",  "0",  "L",  "40", "L",  "42")

考虑你想提取每个列表元素中的第一个元素的简单情况,你可以使用 lapply:

lapply(g, function (x) x[1])

现在我们可以使用 mapply 进行迭代了:

lengths(g) # returns length of each element in the list
g2 <- mapply(function(y) lapply(g, function (x) x[y]), 1:lengths(g)[1])
g2

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
# [1,] "L"  "14" "L"  "39" "L"  "61" "B"  "0"  "L"  "15"  "L"   "59"  "W"   "64" 
# [2,] "L"  "62" "D"  "31" "L"  "10" "L"  "30" "B"  "0"   "D"   "45"  "L"   "43" 
# [3,] "H"  "0"  "L"  "11" "L"  "35" "W"  "45" "H"  "0"   "L"   "40"  "L"   "42" 

g2[,1]
# [[1]]
# [1] "L"

# [[2]]
# [1] "L"

# [[3]]
# [1] "H"

unlist(g2[,1])
# [1] "L" "L" "H"

【讨论】:

  • do.call(rbind, g) 得到矩阵更短/更快(从另一条评论复制,因为已删除)。
  • 这是,伙计!谢谢! lengths() 会派上用场。快速跟进:lapply(g, function (x) x[1]) 中的表单:function (x) x[1] 是否与:function (x){ x[1]} 相同?
  • do.call r2evans 的好电话,我忘了。 @jmb277,{} 允许您对语句进行分组,允许您在函数体中放置多个语句。
【解决方案2】:

作为do.call(rbind, g) 的替代方案,我们可以使用这样一个事实,即data.frame 实际上是一个向量列表,其中所有向量都具有相同的长度。因此,给定的结构g可以转换为data.frame,然后根据要求转置产生矩阵。

重现数据:

g <- list(
  c("L",  "14", "L",  "39", "L",  "61", "B",  "0",  "L",  "15", "L",  "59", "W",  "64"),
  c("L",  "62", "D",  "31", "L",  "10", "L",  "30", "B",  "0",  "D",  "45", "L",  "43"),
  c("H",  "0",  "L",  "11", "L",  "35", "W",  "45", "H",  "0",  "L",  "40", "L",  "42")
)

变换:

m <- t(as.data.frame(g))
dimnames(m) <- NULL   # remove deafault row names
m
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#[1,] "L"  "14" "L"  "39" "L"  "61" "B"  "0"  "L"  "15"  "L"   "59"  "W"   "64" 
#[2,] "L"  "62" "D"  "31" "L"  "10" "L"  "30" "B"  "0"   "D"   "45"  "L"   "43" 
#[3,] "H"  "0"  "L"  "11" "L"  "35" "W"  "45" "H"  "0"   "L"   "40"  "L"   "42"

访问列:

m[, 1]
#[1] "L" "L" "H"

【讨论】:

  • 这也是一个很棒的答案!我必须阅读do.call,因为帮助部分非常笼统!
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2015-01-30
  • 2014-03-09
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2011-10-12
相关资源
最近更新 更多