【问题标题】:In R, how to subset data frame in sapply?在 R 中,如何在 sapply 中对数据帧进行子集化?
【发布时间】:2013-09-18 18:23:50
【问题描述】:

这里的目标是将几个文件的前 6 列连接到 R 中的一个数据框中。 我对为什么方法(1)有效但方法(2)不起作用感到困惑。 对我来说,这两种方法应该是等价的。

调试的答案或提示都非常受欢迎。

方法(一)

ret <- sapply(fn, function(x) { (read.table(x, header = FALSE)) })
ret <- lapply(ret, function(x) {x[, 1:6]})

方法(1)正确输出:

> 头(退) $`../pool.11421.poolFile` V1 V2 V3 V4 V5 V6 1 1 M5132 ACAGTG 11421 351 1,2,3,4,5,6,7,8 2 2 M6764 ACTGAT 11421 351 1,2,3,4,5,6,7,8 3 3 M5597 AGTCAA 11421 351 1,2,3,4,5,6,7,8 4 4 M5636 AGTTCC 11421 351 1,2,3,4,5,6,7,8 5 5 M2463 ATCACG 11421 351 1,2,3,4,5,6,7,8 6 6 M5792 ATGTCA 11421 351 1,2,3,4,5,6,7,8 7 7 M6799 ATTCCT 11421 351 1,2,3,4,5,6,7,8

方法(二)

ret <- sapply(fn, function(x) { (read.table(x, header = FALSE))[, 1:6]})

方法(2)错误输出:

> 头(退) ../pool.11421.poolFile ../pool.11422.poolFile ../pool.11423.poolFile V1 整数,23 整数,48 整数,48 V2字,23字,48字,48字 V3字,23字,48字,48字 V4 整数,23 整数,48 整数,48 V5 整数,23 整数,48 整数,48 V6字,23字,48字,48字

【问题讨论】:

  • 在 (2) 中向 sapply 添加 simple=FALSE 会发生什么?

标签: r dataframe sapply


【解决方案1】:

您的第二个方法返回一个数组。 sapply 具有 simplify 参数。如果 TRUE simplify2array 被调用并且 R 尝试将您的数据转换为向量或数组。详情请见?sapply

试试吧:

ret <- sapply(fn, function(x) { (read.table(x, header = FALSE))[, 1:6]}, simplify=FALSE)

【讨论】:

  • 推论可能是sapply 几乎肯定是这里的错误工具。我还要指出,在方法 1 中,读入的每个数据帧可能有不同数量的列,因此具有不同的长度,因此 sapply 甚至没有尝试简化它们,这允许第二个 lapply打电话按预期工作。在第二种方法中,每次强制相同数量的列会强制进行简化。
  • 感谢两位的回答。我在sapply 中学习了简化选项以及何时可以使用。 @joran,你在这里提到我不应该使用sapply。您建议使用什么工具?
  • @zhanxw 我的意思只是sapply 只是lapply 的一个包装器,它做了一些方便的简化。如果您不想要/不需要这些简化,那么使用lapply 并通过do.call(rbind,...) 之类的方式将它们拼接在一起可能更有意义。
  • @Joran,同样的问题,但在许多多元时间序列数据中,如何从每个时间序列的末尾开始向后选择行?
猜你喜欢
  • 2015-06-20
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2015-10-20
  • 2021-02-16
  • 2020-11-30
相关资源
最近更新 更多