【问题标题】:fill matrix in loop with vectors of different length用不同长度的向量在循环中填充矩阵
【发布时间】:2012-09-28 16:16:23
【问题描述】:

我已经在 R 中为这个问题苦苦挣扎了一段时间:

假设我有一个运行超过 9 个数据文件的 for 循环。在这个循环中,我从一个较长的向量中提取一个短向量。很简单。

之后,仍然在循环期间,我想用新提取的短向量填充矩阵并将矩阵保存到文件中。不容易,因为没有一个短向量具有相同的长度。为避免该问题,我尝试将向量直接保存(仍在循环中)带有write.table()append=TRUE.csv 文件中,但是当我想要时,R 将所有 9 个向量附加在同一列中有 9 列。像by.column=TRUE 这样的东西存在吗?

无论如何,我只想将我的 9 个短向量放在数据文件的 9 列中。在我看来,我对第二种解决方案并不太远。

有人知道如何最终完成这个小程序吗?我将不胜感激。

感谢您的宝贵时间 米歇尔

【问题讨论】:

  • 你不能在最后cbind你的结果并那样写文件吗?
  • 这个link 提供了一个cbind.fill,因为向量的长度不同
  • 您为什么不尝试发布您现在拥有的代码。人们会更容易理解你的意思。
  • 如果您希望合并具有不同行数的列,gdata 包中有一个 cbindX 可以做到这一点。

标签: r loops vector matrix


【解决方案1】:

我建议你稍微调整一下你的工作流程,做这样的事情:

  1. 首先将所有向量收集到一个 R 列表对象中。

  2. 仍然在 R 中,将向量列表按摩到矩阵或 data.frame 中。 (一旦您提取了所有向量并知道最长向量的长度,这将更容易。)

  3. 只有通过调用write.tablewrite.csv 才能写出结果表。

这是一个例子:

## Set up your for() loop or lapply() call so that it returns a list structure 
## like 'l'
l <- list(a=1:9, b=1:2, c=1:5)

## Make a matrix from the list, with shorter vectors filled out with ""s
n <- max(sapply(l, length))
ll <- lapply(l, function(X) {
    c(as.character(X), rep("", times = n - length(X)))
})
out <- do.call(cbind, ll)                 

## Then output it however you'd like. (Here are three options.)
# write.csv(out, file="summary.csv")
# write.csv(out, file="summary.csv", quote=FALSE)
# write.table(out, file="summary.txt", row.names=FALSE, quote=FALSE, sep="\t")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2013-05-09
    • 2019-05-27
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多