我的数据由一个很大的不同长度的整数列表组成,我想将每个元素子集为预先指定的长度。
我的数据示例:
my_list <- list(c(-4L, -2L), c(4L, 6L, 9L, -4L, 10L, 2L, -3L, 8L), c(-1L,
1L), c(-4L, -5L, 5L, -2L, 4L, 10L, 7L), c(-2L, 10L, 3L, -3L,
8L, -1L, 7L, 4L, 0L, 2L))
我事先知道最终的长度,并希望根据这些计算的长度来选择每个列表元素的前n个数字。
假设这些最终长度为:
sizes <- c(1, 7, 0, 5, 8)
这意味着输出应如下所示:
[[1]]
[1] -4
[[2]]
[1] 4 6 9 -4 10 2 -3
[[3]]
integer(0)
[[4]]
[1] -4 -5 5 -2 4
[[5]]
[1] -2 10 3 -3 8 -1 7 4
由于我的真实的数据由〉500k组组成,循环通常太慢,因此我更喜欢更快的解决方案。
任何帮助将不胜感激。
2条答案
按热度按时间k4aesqcs1#
我能想到的最简单的代码是
Map
数据和大小,并通过head
进行子集:通过使用相同方法中的直接子集,速度可以提高4倍:
直接通过
length<-
使用for循环来修改列表会更快:循环返回的结果也与
Map
选项相同:2w2cym1i2#
您可以编写自己的C / C++实现,以获得更快的速度。
这里有一种方法,当你的sizes对象中有一个
0
时,我创建一个空向量,而不是让列表元素为NULL,因为这与你期望的输出一致。这也没有错误检查(索引超出范围等),它假设你所有的输入都被净化了。